別々の 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 のデータバインディングがどのように機能するかについてある程度は理解できたように感じますが、この問題については完全に困惑しています。助けてくれてありがとう。