2012-07-13 50 views
1

有一个奇怪的问题,两个WPF数据网格绑定到单独的ObservableCollections。编辑一个数据网格改变另一个

这里是我的XAML:

<Grid Name="gridShifts"> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition/> 
    <ColumnDefinition/> 
</Grid.ColumnDefinitions> 
    <Custom:C1DataGrid Name="dgShift1" 
         HorizontalAlignment="Left" AutoGenerateColumns="False" CanUserAddRows="False" CanUserRemoveRows="False" CanUserReorderColumns="False" Grid.Column="0"> 
     <Custom:C1DataGrid.Columns> 
      <Custom:DataGridTextColumn Binding="{Binding Path=Type, Mode=TwoWay}" IsReadOnly="True" Header="Work Center"/> 
      <Custom:DataGridTextColumn Binding="{Binding Path=RegularSkill, Mode=TwoWay }" Header="Personnel"/> 
     </Custom:C1DataGrid.Columns> 
    </Custom:C1DataGrid> 
    <Custom:C1DataGrid Name="dgShift2" 
         HorizontalAlignment="Left" AutoGenerateColumns="False" CanUserAddRows="False" CanUserRemoveRows="False" CanUserReorderColumns="False" Grid.Column="1"> 
     <Custom:C1DataGrid.Columns> 
      <Custom:DataGridTextColumn Binding="{Binding Path=Type, Mode=TwoWay}" IsReadOnly="True" Header="Work Center"/> 
      <Custom:DataGridTextColumn Binding="{Binding Path=RegularSkill, Mode=TwoWay }" Header="Personnel"/> 
     </Custom:C1DataGrid.Columns> 
    </Custom:C1DataGrid> 
</Grid> 

这里是我的代码背后:

public partial class MainWindow : Window 
{ 
    AMMData.Manpower mp = new AMMData.Manpower(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     gridShifts.DataContext = mp; 
     dgShift1.ItemsSource = mp.WorkShifts[0].WCList; 
     dgShift2.ItemsSource = mp.WorkShifts[1].WCList; 

    } 
} 

编辑:这里是人力资源类:

public enum WCSpecialty 
{ 
    Indirect, 
    Airframes, 
    AviationLifeSupport, 
    PeriodicMaintenance, 
    Electronics, 
    Electrical_Instruments, 
    Armaments, 
    Reconnaissance, 
    Line, 
    NA 
} 

public class Manpower : ComponentDataWrapper 
{ 
    #region Private Properties 

    private ObservableCollection<WCCollection> workShifts = new ObservableCollection<WCCollection>(); 

    #endregion 

    #region Public Properties 

    public ObservableCollection<WCCollection> WorkShifts { set { workShifts = value; NotifyPropertyChanged("WorkShifts"); } get { return workShifts; } } 

    #endregion 


    public Manpower() 
    { 
     Name = "New Work Center Structure"; 
     Description = "New Work Center Personnel Description"; 
     LastChanged = System.DateTime.Now; 

     var wcc1 = new AMMData.WCCollection(); 
     var wcc2 = new AMMData.WCCollection(); 

     var wc1 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.Indirect, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc2 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.Airframes, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc3 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.AviationLifeSupport, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc4 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.PeriodicMaintenance, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc5 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.Electronics, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc6 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.Electrical_Instruments, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc7 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.Armaments, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc8 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.Reconnaissance, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc9 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.Line, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 
     var wc10 = new AMMData.WorkCenter { Type = AMMData.WCSpecialty.NA, RegularSkill = 0, MedSkill = 999, HighSkill = 999 }; 

     wcc1.WCList.Add(wc1); 
     wcc1.WCList.Add(wc2); 
     wcc1.WCList.Add(wc3); 
     wcc1.WCList.Add(wc4); 
     wcc1.WCList.Add(wc5); 
     wcc1.WCList.Add(wc6); 
     wcc1.WCList.Add(wc7); 
     wcc1.WCList.Add(wc8); 
     wcc1.WCList.Add(wc9); 
     wcc1.WCList.Add(wc10); 

     wcc2.WCList.Add(wc1); 
     wcc2.WCList.Add(wc2); 
     wcc2.WCList.Add(wc3); 
     wcc2.WCList.Add(wc4); 
     wcc2.WCList.Add(wc5); 
     wcc2.WCList.Add(wc6); 
     wcc2.WCList.Add(wc7); 
     wcc2.WCList.Add(wc8); 
     wcc2.WCList.Add(wc9); 
     wcc2.WCList.Add(wc10); 

     WorkShifts.Add(wcc1); 
     WorkShifts.Add(wcc2); 

    } 
} 

public class WCCollection : ComponentDataWrapper 
{ 
    private ObservableCollection<WorkCenter> wcList = new ObservableCollection<WorkCenter>(); 

    public ObservableCollection<WorkCenter> WCList { set { wcList = value; NotifyPropertyChanged("WCList"); } get { return wcList; } } 
} 

    public class WorkCenter : ComponentDataWrapper 
{ 
    #region private 

    private WCSpecialty type; 
    private int regularSkill; 
    private int highSkill; 
    private int medSkill; 

    #endregion 

    #region public 

    public WCSpecialty Type { set { type = value; NotifyPropertyChanged("Type"); } get { return type; } } 
    public int RegularSkill { set { regularSkill = value; NotifyPropertyChanged("RegularSkill"); } get { return regularSkill; } } 
    public int HighSkill { set { highSkill = value; NotifyPropertyChanged("HighSkill"); } get { return highSkill; } } 
    public int MedSkill { set { medSkill = value; NotifyPropertyChanged("MedSkill"); } get { return medSkill; } } 

    public int RegularWholePeople { get { return regularSkill/10; } } 

    #endregion 
} 

我的问题是,当我编辑一个数据网格,其他的值也会改变。我已经尝试将两个网格的datacontext设置为它们各自的ObservableCollections,但同样的事情发生。我觉得我对WPF数据绑定在这一点上的工作方式非常熟悉,但我完全无法理解这个问题。谢谢你的帮助。

+0

你可以显示对象'mp'的代码吗? (另外,如果你在后台代码中设置'ItemsSource'而不是绑定它,你不需要在你的父网格上设置'DataContext') – Rachel 2012-07-13 16:48:20

+0

我添加了mp对象的代码。我试图在我的原始文章中简洁。 – WasGoodDone 2012-07-13 17:00:28

回答

2

它看起来像您的项目被添加到您的ObservableCollections作为参考,而不是价值。

这意味着两个集合包含内存中的同一个对象的引用,所以在一个集合更新对象实际更新单个对象的引用,从而导致以及

+0

就是这样。非常感谢你。 – WasGoodDone 2012-07-13 17:20:35

0

你已经通过了其他集合更新mp对象到DataGrid。因此,不需要使用后面的代码来传递集合。

更新您的绑定是这样的:

<Custom:DataGridTextColumn Binding="{Binding ElementName=gridShifts, Path=DataContex.WorkShifts[0].WCList Mode=TwoWay}" IsReadOnly="True" Header="Work Center"/> 

您还应该使用CollectionViewSource实例为您数据源如下所示WPF’s CollectionViewSource。这是一个更清洁的设计,可能会在以后带来优惠。

相关问题