Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
C# 将带有ComboboxColumns的DataGrid绑定到列表_C#_Wpf_Data Binding_Datagrid - Fatal编程技术网

C# 将带有ComboboxColumns的DataGrid绑定到列表

C# 将带有ComboboxColumns的DataGrid绑定到列表,c#,wpf,data-binding,datagrid,C#,Wpf,Data Binding,Datagrid,我有一个字典,其中的值用作DataGrid中comboboxColumn的源。任务如下:当用户从组合框中选择适当的项时,不应将键值写入列表。 我的代码: Dictionary<double, string> scores = new Dictionary<double, string>(); scores.Add(1, "the same"); score

我有一个字典,其中的值用作DataGrid中comboboxColumn的源。任务如下:当用户从组合框中选择适当的项时,不应将键值写入列表。 我的代码:

        Dictionary<double, string> scores = new Dictionary<double, string>();                                   
        scores.Add(1, "the same");
        scores.Add(3, "moderate superiority");
        scores.Add(5, "strong superiority");
        scores.Add(7, "very strong superiority");
        scores.Add(9, "extremely superiority");


        //define number of alternatives
        int num = Alternatives.Children.Count - 1;

        //initialize matrix for assessment scores

        for (int i = 0; i < num; i++)
        {                
            gridAssessment.Add(new double[num]);
        }

        //set initial values
        for (int i = 0; i < num; i++)
        {
            gridAssessment[i][i] = scores.ElementAt(0).Key;                
        }

        //define source for assessment grid
        grAssessment.ItemsSource = gridAssessment;
        grAssessment.AutoGenerateColumns = false;            


        //add columns to the grid
        for (int i = 0; i < num; i++)
        {
            DataGridComboBoxColumn col = new DataGridComboBoxColumn();               
            grAssessment.Columns.Add(col);
            col.Width = new DataGridLength(1, DataGridLengthUnitType.Star);

            //define source for comboboxes
            col.ItemsSource = scores;                
            col.DisplayMemberPath = "Value";
            col.SelectedValuePath = "Key";
            string a = "[" + i.ToString() + "]";
            Binding t = new Binding(a);
            t.Mode = BindingMode.TwoWay;  
            t.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;              
            col.SelectedValueBinding = t;                   
        } 
字典分数=新字典();
分数。添加(1,“相同”);
增加(3,“中等优势”);
得分。增加(5,“强优势”);
添加(7,“非常强的优势”);
得分。添加(9,“极端优越”);
//定义备选方案的数量
int num=alternations.Children.Count-1;
//初始化评估分数矩阵
for(int i=0;i

你能帮我装订吗?由于选定值的键未存储在列表中:(

我使用了相同的代码并尝试重新创建UI

代码隐藏

List gridAssessment=新列表()

public主窗口()
{
初始化组件();
字典分数=新字典();
分数。添加(1,“相同”);
增加(3,“中等优势”);
得分。增加(5,“强优势”);
添加(7,“非常强的优势”);
得分。添加(9,“极端优越”);
//定义备选方案的数量
int num=3;//alternations.Children.Count-1;
//初始化评估分数矩阵
for(int i=0;i
XAML


我看到显示的值为1,2,3。如果需要设置字符串值,则可能需要更改列表gridAssessment=new List() as ListgridAssessment=新列表(); 并使用SelectedValuePath反转组合的DisplayMemberPath


希望这能有所帮助!

我将Dictionary更改为ObservableCollection,现在它可以工作了。

有什么原因让你在代码中而不是在xaml中这样做吗?@SamTheDev,因为列是动态添加的。这就是为什么我不在XAMLyeap中对它们进行编码,预定义的值会正确显示。但当用户从combobox中选择任何项目时,它是not已与源同步。因此,从源到目标只有单向更新,而不是从目标到源的单向更新。当您从combo中选择值后单击“检查”按钮时,它是否在标签上显示正确的值
    public MainWindow()
    {
        InitializeComponent();

        Dictionary<double, string> scores = new Dictionary<double, string>();
        scores.Add(1, "the same");
        scores.Add(3, "moderate superiority");
        scores.Add(5, "strong superiority");
        scores.Add(7, "very strong superiority");
        scores.Add(9, "extremely superiority");


        //define number of alternatives
        int num = 3;//Alternatives.Children.Count - 1;

        //initialize matrix for assessment scores

        for (int i = 0; i < num; i++)
        {
            gridAssessment.Add(new double[num]);
        }

        //set initial values
        for (int i = 0; i < num; i++)
        {
            gridAssessment[i][i] = scores.ElementAt(0).Key;
        }

        //define source for assessment grid
        grAssessment.ItemsSource = gridAssessment;
        grAssessment.AutoGenerateColumns = false;


        //add columns to the grid
        for (int i = 0; i < num; i++)
        {
            DataGridComboBoxColumn col = new DataGridComboBoxColumn();
            grAssessment.Columns.Add(col);
            col.Width = new DataGridLength(1, DataGridLengthUnitType.Star);

            //define source for comboboxes
            col.ItemsSource = scores;
            col.DisplayMemberPath = "Value";
            col.SelectedValuePath = "Key";
            string a = "[" + i.ToString() + "]";
            Binding t = new Binding(a);
            t.Mode = BindingMode.TwoWay;
            t.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            col.SelectedValueBinding = t;
        } 

    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        StringBuilder str1 = new StringBuilder();

        foreach (var c in gridAssessment)
        {
            str1.Append("<");
            foreach (var item in c)
            {
                str1.AppendFormat(" {0} ", item);    
            }
            str1.Append(">");
        }
        val.Content = str1.ToString();
    }
<Grid HorizontalAlignment="Left" VerticalAlignment="Top">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <DataGrid Name="grAssessment" />
    <Button Content="Check" Grid.Row="1" Click="Button_Click" />
    <Label Name="val" Grid.Row="2"  />
</Grid>