1

別々の ObservableCollection にバインドされた 2 つの 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
}

私の問題は、1 つのデータグリッドを編集すると、もう一方の値も変更されることです。両方のグリッドの datacontext をそれぞれの ObservableCollections に設定しようとしましたが、同じことが起こります。この時点で、WPF のデータバインディングがどのように機能するかについてある程度は理解できたように感じますが、この問題については完全に困惑しています。助けてくれてありがとう。

4

2 に答える 2

2

あなたのアイテムはObservableCollections、値ではなく参照によって追加されているようです。

これは、両方のコレクションにメモリ内の同じオブジェクトへの参照が含まれていることを意味します。つまり、1 つのコレクション内のオブジェクトを更新すると、実際には 1 つのオブジェクト参照が更新され、他のコレクションも更新されます。

于 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"/>

WPF の CollectionViewSourceCollectionViewSourceに示されているように、DataSource のインスタンスも使用する必要があります。これはよりクリーンな設計であり、後でメリットがもたらされる可能性があります。

于 2012-07-13T17:05:48.257 に答える