【问题标题】:Bind DataGrid with ComboboxColumns to List将 DataGrid 与 ComboboxColumns 绑定到列表
【发布时间】:2015-11-16 21:33:20
【问题描述】:

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

        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;                   
        } 

您能帮我装订吗?因为所选值的键未存储在列表中:(

【问题讨论】:

  • 你有什么理由在代码而不是 xaml 中这样做?
  • @SamTheDev 因为列是动态添加的。这就是为什么我不在 XAML 中编写代码

标签: c# wpf data-binding datagrid


【解决方案1】:

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

代码隐藏

List gridAssessment = new List();

    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();
    }

XAML

<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>

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

希望这会有所帮助!

【讨论】:

  • 是的,预定义的值显示正确。但是当用户从组合框中选择任何项目时,它不会与 Source 同步。所以只有从源到目标的 OneWay 更新,反之则不然。
  • 当您从组合中选择值后单击“检查”按钮时,它是否在标签 处显示正确的值>
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2015-11-22
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多