【发布时间】:2016-07-27 10:46:56
【问题描述】:
在我的项目中,我有一个DataGrid,其中有两个模板列,每个列都包含一个ComboBox。当我在任何行中更改ComboBox 之一的选择时,更改会反映在所有行中。
我试过设置IsSynchronizedWithCurrentItem="False",但这没有帮助。
谁能给我一个解决这个问题的方法?这是我的代码。
Xaml
<DataGrid
x:Name="dtg"
CanUserAddRows="False"
AutoGenerateColumns="False"
IsSynchronizedWithCurrentItem="False"
ItemsSource="{Binding Pdts, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Type" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
IsEditable="True"
ItemsSource="{Binding DataContext.TypeCollection, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DisplayMemberPath="TypeName"
SelectedItem="{Binding Type}"
SelectedValuePath="Id"
SelectionChanged="ComboBox_SelectionChanged_1"
SelectedValue="{Binding TypeId, Mode= TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Name" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
IsEditable="True"
KeyUp="ComboBox_KeyUp_1"
IsSynchronizedWithCurrentItem="False"
ItemsSource="{Binding DataContext.PdtCollection, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DisplayMemberPath="PdtName"
SelectedItem="{Binding Pdt}"
SelectedValuePath="Id"
SelectedValue="{Binding Id, Mode= TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
视图模型
public class MainWindowViewModel : Base {
public ObservableCollection<Type> TypeCollection { get; set; }
public ObservableCollection<Pdt> PdtCollection { get; set; }
public ObservableCollection<PdtAndType> Pdts { get; set; }
public MainWindowViewModel() {
TypeCollection = new ObservableCollection<Type>();
PdtCollection = new ObservableCollection<Pdt>();
Pdts = new ObservableCollection<PdtAndType>();
TypeCollection.Add(new Type {Id = 1, TypeName = "one"});
TypeCollection.Add(new Type {Id = 2, TypeName = "two"});
TypeCollection.Add(new Type {Id = 3, TypeName = "three"});
TypeCollection.Add(new Type {Id = 4, TypeName = "four"});
TypeCollection.Add(new Type {Id = 5, TypeName = "five"});
addPdt();
}
public void add(int typeId = 1) {
Random r = new Random();
int x = r.Next(10);
PdtCollection.Clear();
for (int i = 0; i < x; i++) {
PdtCollection.Add(new Pdt {Id = 1, PdtName = "P" + i + 1});
}
}
public void addPdt() {
Pdts.Add(new PdtAndType());
}
}
模型类Pdt
public class Pdt : Base {
private int _ID;
public int Id {
get { return _ID; }
set {
if (_ID != value) {
_ID = value;
onPropertyChanged("Id");
}
}
}
private String _PdtName;
public String PdtName {
get { return _PdtName; }
set {
if (_PdtName != value) {
_PdtName = value;
onPropertyChanged("PdtName");
}
}
}
private int _typeId;
public int TypeId {
get { return _typeId; }
set {
if (_typeId != value) {
_typeId = value;
onPropertyChanged("TypeId");
}
}
}
}
模型类类型
public class Type : Base {
private int _ID;
public int Id {
get { return _ID; }
set {
if (_ID != value) {
_ID = value;
onPropertyChanged("Id");
}
}
}
private String _typeName;
public String TypeName {
get { return _typeName; }
set {
if (_typeName != value) {
_typeName = value;
onPropertyChanged("TypeName");
}
}
}
}
模型类PdtAndtype
public class PdtAndType : Base {
private int _typeId;
public int TypeId {
get { return _typeId; }
set {
if (_typeId == value) return;
_typeId = value;
onPropertyChanged(nameof(TypeId));
}
}
private int _pdtId;
public int PdtId {
get { return _pdtId; }
set {
if (_pdtId == value) {
return;
}
_pdtId = value;
onPropertyChanged(nameof(PdtId));
}
}
private Type _type;
public Type Type {
get { return _type; }
set {
if (_type == value) {
return;
}
_type = value;
onPropertyChanged(nameof(Type));
}
}
private Pdt _pdt;
public Pdt Pdt {
get { return _pdt; }
set {
if (_pdt == value) {
return;
}
_pdt = value;
onPropertyChanged(nameof(Pdt));
}
}
}
【问题讨论】:
标签: c# wpf combobox datagrid datagridtemplatecolumn