C# 在Datagrid(WPF)中绑定字典值Combobox和TextBox列

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

我目前正在使用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中的值。我的第一列中也不能有重复的值

请参见此处预期行为的大致情况:



模型(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>`