【问题标题】:How to bind array for DataGridComboBoxColumn WPF如何为 DataGridComboBoxColumn WPF 绑定数组
【发布时间】:2014-02-28 07:15:08
【问题描述】:

我有一个带有组合框的 DataGrid

<DataGridComboBoxColumn Header="Header 2" ItemsSource="{Binding Pet}">

基于 MVVM 模式的项目。当我尝试在 TextColumn 上显示数据时,它可以工作

<DataGridTextColumn Header="Header 1" Binding="{Binding ID}" />

但是,我不知道如何为 DataGridComboBoxColumn 绑定数据。

模型代码:

    public string ID
    {
        get { return _id; }
        set { _id = value; NotifyPropertyChanged("ID"); }
    }
    public string[] Pet
    {
        get { return _pet; }
        set { _pet = value; NotifyPropertyChanged("Pet"); }
    }

【问题讨论】:

    标签: c# .net wpf mvvm binding


    【解决方案1】:

    不要使用&lt;DataGridComboBoxColumn&gt;,而是尝试像这样使用&lt;DataGridTemplateColumn&gt;

    <DataGridTemplateColumn Header="ID">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding Path=DataContext.Pet, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" SelectedItem="{Binding ID}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
    

    在此示例中,我将 Combobox 的项目源绑定为当前 ViewModel 中定义的 Pet 数组集合,并将所选项目绑定为绑定到完整 DataGrid 的 List 集合的 ID 属性。

    【讨论】:

    • 感谢您的回答,但它对我不起作用。我有一个模型public class ListItem,它包含属性public string[] Pet,我尝试从中获取数据。我是否需要更改宠物的财产类型?另外,我之前绑定了&lt;DataGrid ItemsSource="{Binding ListItems}"...&gt;,这就是为什么绑定&lt;DataGridTextColumn Header="Header 1" Binding="{Binding ID}" /&gt; 可以正常工作的原因。
    • 假设 ListItems 是 ListItem 类的集合。然后忽略绑定中的RelativeSource部分,只需写&lt;ComboBox ItemsSource="{Binding Path=Pet}"/&gt;就可以了
    【解决方案2】:

    DataGridComboBoxColumn 和 DataGridTextColumn 不会参与逻辑树。因此绑定在此不起作用。您可以通过以下两种方式克服这个问题, 1.将你的视图模型定义为静态资源和StaticResource绑定 2. 您可以使用 RelativeSource 绑定,这也适用于您的情况

    有关如何操作的更多信息,请参阅以下博客, http://blogs.msdn.com/b/vinsibal/archive/2008/08/28/wpf-datagrid-working-with-datagridcomboboxcolumns-part-2.aspx

    【讨论】:

    • 我尝试绑定为静态资源ItemsSource="{Binding Source={StaticResource Pet}}",但收到错误XamlParseException
    • 您可以参考以下链接,lfhck.com/question/378365/…
    【解决方案3】:

    我已经遇到同样的问题一天了,发现这是一个更好的解决方案,因为它不会弄乱组合框的渲染:

                <DataGridComboBoxColumn Header="ID" SelectedItemBinding="{Binding ID}">
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding Pet}"/>
                            <Setter Property="IsReadOnly" Value="True"/>
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding Pet}"/>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 2011-07-27
      • 1970-01-01
      • 2015-11-24
      相关资源
      最近更新 更多