1

绑定到单独的 ObservableCollections 的两个 WPF 数据网格有一个奇怪的问题。

这是我的 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
}

我的问题是,当我编辑一个数据网格时,另一个的值也会改变。我已经尝试将两个网格的数据上下文设置为它们各自的 ObservableCollections,但同样的事情发生了。我觉得我现在对 WPF 数据绑定的工作方式比较熟悉,但我完全被这个问题难住了。谢谢你的帮助。

4

2 回答 2

2

看起来您的项目是ObservableCollections通过引用而不是按价值添加到您的。

这意味着两个集合都包含对内存中同一对象的引用,因此更新一个集合中的对象实际上是更新单个对象引用,这会导致另一个集合也更新

于 2012-07-13T17:03:40.043 回答
0

您已经将 mp 对象传递给 DataGrid。因此,无需使用后面的代码传递集合。

像这样更新您的绑定:

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

您还应该CollectionViewSource为您的数据源使用实例,如此处WPF 的 CollectionViewSource所示。这是一种更简洁的设计,以后可能会带来好处。

于 2012-07-13T17:05:48.257 回答