C# 在Datagrid(WPF)中绑定字典值Combobox和TextBox列
我目前正在使用MVVM体系结构。我简化了我的代码来解释我的问题。主要思想是我有一个模型(Combo.cs),一个用于组合服务的类(ComboServices.cs),它将对对象组合执行操作,一个视图模型(ViewModel.cs),它保存两个窗口(窗口1和窗口2)和两个视图(窗口1和窗口2)的数据 窗口1有一个绑定到CombosList(ObservableCollection)的列表框,CombosList是我的ViewModel中的一个属性。然后,我从列表中选择一个对象(绑定到ObjCombo),并打开(单击绑定到modifycombo命令的“修改”按钮)一个新窗口(窗口2),在该窗口中我希望在DataGrid中查看此对象的属性 我的DataGrid应该将第一列作为组合框,而第二列应该是文本框。这两列应该自动填充ObjCombo.LoadCasesInCombo(字典)的值。如何自动填充字典值(第一列中的键和第二列中的值),同时让第一列中的Combobox仅显示下拉列表中CombosList中的值。我的第一列中也不能有重复的值 请参见此处预期行为的大致情况:C# 在Datagrid(WPF)中绑定字典值Combobox和TextBox列,c#,wpf,mvvm,C#,Wpf,Mvvm,我目前正在使用MVVM体系结构。我简化了我的代码来解释我的问题。主要思想是我有一个模型(Combo.cs),一个用于组合服务的类(ComboServices.cs),它将对对象组合执行操作,一个视图模型(ViewModel.cs),它保存两个窗口(窗口1和窗口2)和两个视图(窗口1和窗口2)的数据 窗口1有一个绑定到CombosList(ObservableCollection)的列表框,CombosList是我的ViewModel中的一个属性。然后,我从列表中选择一个对象(绑定到ObjComb
模型(Combo.cs)
公共类组合:INotifyPropertyChanged
{
私有字符串组合名;
私有字典loadcasesincombo;
公共字符串组合名
{
得到
{
返回组合名;
}
设置
{
comboname=值;
}
}
公共字典LoadCasesInCombo
{
得到
{
返回loadcasesincombo;
}
设置
{
loadcasesincombo=值;
}
}
}
我的ViewModel(ViewModel.cs)包含要在视图中数据绑定到datagrid的属性
public class ViewModel : INotifyPropertyChanged
{
private Combo objcombo;
public Combo ObjCombo
{
get { return objcombo; }
set { objcombo = value; }
}
private ComboServices ObjComboServices;
private ObservableCollection<Combo> combosList;
public ObservableCollection<Combo> CombosList
{
get { return combosList; }
set { combosList = value; }
}
public MainWindowViewModel()
{
ObjComboServices = new ComboServices();
modifycomboCommand = new CombosCommands(Modify);
}
#region Modify Combo region
private CombosCommands modifycomboCommand;
public CombosCommands ModifyComboCommand
{
get { return modifycomboCommand; }
}
public void Modify()
{
// Open second view with DataGrid
Dictionary<string, double> temp_loadcasesincombo = ObjCombo.LoadCasesInCombo;
// this is the dictionary I want to autofill my datagrid 2 columns.
}
}
公共类视图模型:INotifyPropertyChanged
{
私有组合objcombo;
公共组合ObjCombo
{
获取{return objcombo;}
设置{objcombo=value;}
}
专用组合服务ObjComboServices;
私有可观测集合列表;
公共可观测集合组合列表
{
获取{return combosList;}
设置{combosList=value;}
}
公共主窗口视图模型()
{
ObjComboServices=new ComboServices();
modifycomboCommand=新的CombosCommand(修改);
}
#区域修改组合区域
私有CombosCommand命令modifycomboCommand;
公共CombosCommand ModifyComboCommand
{
获取{return modifycomboCommand;}
}
public void Modify()
{
//使用DataGrid打开第二个视图
字典temp_loadcasesincombo=ObjCombo.loadcasesincombo;
//这是我想自动填充datagrid 2列的字典。
}
}
选项1:
<DataGridComboBoxColumn
SelectedValueBinding="{Binding Name}"
DisplayMemberPath="Name" HeaderStyle="{StaticResource CenterGridHeaderStyle}"
SelectedValuePath="Name" Header="Load Name" Width="300">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.CombosList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.CombosList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
备选案文2:`
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsEditable="True" DisplayMemberPath="Name" SelectedValuePath="Name" IsTextSearchEnabled="True"
Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Path=DataContext.CombosAndLoadCasesList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>`
`
我放弃了绑定字典。解决了这个问题,请参见两个备选方案的答案。
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsEditable="True" DisplayMemberPath="Name" SelectedValuePath="Name" IsTextSearchEnabled="True"
Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Path=DataContext.CombosAndLoadCasesList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>`