Having a weird problem with two WPF datagrids bound to separate ObservableCollections.
Here’s my 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>
And here’s my code behind:
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;
}
}
EDIT: Here is the Manpower class:
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
}
My problem is that when I edit one datagrid, the other’s values also change. I’ve tried setting the datacontext for both grids to their respective ObservableCollections, but the same thing happens. I feel like I’m moderately familiar with how WPF databinding works at this point, but I’m completely stumped on this issue. Thanks for any help.
It looks like your items are being added to your
ObservableCollectionsby reference, not by value.This means both collections contain a reference to the same object in memory, so updating an object in one collection is actually updating the single object reference, which causes the other collection to update as well