Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 编辑一个数据网格会改变另一个数据网格_Wpf_Data Binding_Datagrid_Wpfdatagrid - Fatal编程技术网

Wpf 编辑一个数据网格会改变另一个数据网格

Wpf 编辑一个数据网格会改变另一个数据网格,wpf,data-binding,datagrid,wpfdatagrid,Wpf,Data Binding,Datagrid,Wpfdatagrid,两个WPF数据网格绑定到单独的ObservableCollection时出现了一个奇怪的问题 这是我的XAML: 编辑:以下是人力资源类: public enum WCSpecialty { Indirect, Airframes, AviationLifeSupport, PeriodicMaintenance, Electronics, Electrical_Instruments, Armaments, Reconnaiss

两个WPF数据网格绑定到单独的ObservableCollection时出现了一个奇怪的问题

这是我的XAML:

编辑:以下是人力资源类:

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
}
公共枚举
{
间接的,
机身,,
拯救生命支持,
定期维护,
电子学,
电气仪表,
军备,,
侦察,,
行,,
NA
}
公共类人力:ComponentDataWrapper
{
#区域私有财产
private ObservableCollection Workshift=新ObservableCollection();
#端区
#区域公共财产
public observeCollection workshift{set{workshift=value;NotifyPropertyChanged(“workshift”);}get{return workshift;}}
#端区
公共人力()
{
Name=“新建工作中心结构”;
Description=“新工作中心人员说明”;
LastChanged=System.DateTime.Now;
var wcc1=新的AMMData.WCCollection();
var wcc2=新的AMMData.WCCollection();
var wc1=new AMMData.WorkCenter{Type=AMMData.wcspecialist.Indirect,RegularSkill=0,MedSkill=999,HighSkill=999};
var wc2=新的AMMData.WorkCenter{Type=AMMData.wcspeciality.airbrames,常规杀伤=0,MedSkill=999,HighSkill=999};
var wc3=new AMMData.WorkCenter{Type=AMMData.wcspeciality.AviationLifeSupport,regularlskill=0,MedSkill=999,HighSkill=999};
var wc4=new AMMData.WorkCenter{Type=AMMData.wcspeciality.PeriodicMaintenance,RegularSkill=0,MedSkill=999,HighSkill=999};
var wc5=new-AMMData.WorkCenter{Type=AMMData.WCSpecialty.Electronics,RegularSkill=0,MedSkill=999,HighSkill=999};
var wc6=新的AMMData.WorkCenter{Type=AMMData.wcspeciality.electronic_仪器,RegularSkill=0,MedSkill=999,HighSkill=999};
var wc7=新的AMMData.WorkCenter{Type=AMMData.WCSpecialty.armament,常规杀伤=0,MedSkill=999,HighSkill=999};
var wc8=new-AMMData.WorkCenter{Type=AMMData.wcspeciality.conservation,RegularSkill=0,MedSkill=999,HighSkill=999};
var wc9=new-AMMData.WorkCenter{Type=AMMData.WCSpecialty.Line,regularlskill=0,MedSkill=999,HighSkill=999};
var wc10=new-AMMData.WorkCenter{Type=AMMData.WCSpecialty.NA,regularlskill=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);
工作班次。添加(wcc1);
工作班次。添加(wcc2);
}
}
公共类WCCollection:ComponentDataWrapper
{
私有ObservableCollection wcList=新ObservableCollection();
public observeCollection WCList{set{WCList=value;NotifyPropertyChanged(“WCList”);}get{return WCList;}}
}
公共类工作中心:ComponentDataWrapper
{
#地区私人
私人专业类型;
私家侦探;
私人智力和高技能;
私人技能;
#端区
#地区公众
公共WCSpeciality类型{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;}}
#端区
}

我的问题是,当我编辑一个数据网格时,另一个的值也会改变。我尝试将两个网格的datacontext设置为各自的ObservableCollections,但发生了同样的事情。在这一点上,我觉得我对WPF数据绑定的工作原理相当熟悉,但在这个问题上我完全被难住了。感谢您的帮助。

看起来您的项目是通过引用而不是通过值添加到您的
可观察集合中的


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

您已经将mp对象传递给了DataGrid。因此,不需要使用代码隐藏来传递集合

按如下方式更新绑定:

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


您还应该为数据源使用
CollectionViewSource
实例,如下所示。这是一个更干净的设计,以后可能会带来好处。

您能显示object
mp
的代码吗?(另外,如果要在code behind中设置
ItemsSource
,而不是绑定它,则不需要在父网格上设置
DataContext
)。我试图在我最初的帖子中简洁,就是这样。非常感谢你。
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
}
<Custom:DataGridTextColumn Binding="{Binding ElementName=gridShifts, Path=DataContex.WorkShifts[0].WCList Mode=TwoWay}" IsReadOnly="True"  Header="Work Center"/>