【问题标题】:WPF DataGrid Combobox selectedItemWPF DataGrid 组合框 selectedItem
【发布时间】:2014-04-14 19:45:30
【问题描述】:

我有一个 DataGrid,其组合框分配了客户 ID,每个客户 ID 可能有许多帐户 ID,这些帐户 ID 分配在自己的组合框中。我想要做的是,当用户从组合框中选择客户 ID 时,帐户 ID 然后会使用所选的特定客户 ID 进行更新。

我想我的代码差不多了。

在这里,我在组合框元素样式中应用了 customerId 的 itemsource。如您所见,当从客户框中选择一个项目时,我有一个 SelectedItem 的属性。

                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource"
                Value="{Binding DataContext.EntityCollection,
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                                                     AncestorType=Window}}"/>
                        <Setter Property="DisplayMemberPath" Value="Name"/>
                        <Setter Property="SelectedItem" Value="{Binding SelectedItem}"></Setter>
                        <Setter Property="HorizontalAlignment" Value="Center"></Setter>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>

所以在 Account Id 的 Combobox 中,我不确定将 SelectedItem.AID 代码放在哪里...

我已将它放在第一行的 SelectedValueBinding 属性中,但它不起作用。我需要将 SelectedItem 放在 EditingElementStyle 标记内的 Itemsource 属性中吗?

            <DataGridComboBoxColumn SelectedValueBinding="{Binding SelectedItem.AID}"                SelectedValuePath="SID"  Header="SID" Width="70">
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource"
                Value="{Binding DataContext.EntityCollection, 
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                                                    AncestorType=Window}}"/>
                        <Setter Property="DisplayMemberPath" Value="AID"/>
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource"
                Value="{Binding DataContext.EntityCollection,
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                                                     AncestorType=Window}}"/>
                        <Setter Property="DisplayMemberPath" Value="AID"/>
                        <Setter Property="HorizontalAlignment" Value="Center"></Setter>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle> 

但是我可能会走得很远,所以我将不胜感激。

谢谢

【问题讨论】:

    标签: c# wpf xaml datagrid observablecollection


    【解决方案1】:
    <Setter Property="ItemsSource" Value="{Binding DataContext.EntityCollection,
    

    我不完全确定这是否可能,但我不建议以这种方式使用。

    将后面代码中的ViewModel 绑定到ViewDataContext。现在您可以将 ItemsSource 绑定到 ViewModel 中的任何 ObservableCollection 属性。那可能是你的EntityCollection

    好吧,当使用DataGridComboBoxColumn时,您需要做的就是通过绑定目标属性告诉该列数据所在的位置。

    如果您将Customer 列表应用于您的DataGrid,并且您的属性名为ID,您的标记可能如下所示:

    SelectedValueBinding="{Binding ID, Mode=TwoWay}"
    

    检查Mode 是非常必要的,以便传输对您的财产所做的更改。

    现在,将任何更改应用到您的其他 ComboBox,例如添加或创建项目,您需要使用另一个ObservableCollection 并将其绑定到第二个Combobox。如果你这样做了,当对第一个项目进行任何更改时,你可以控制第二个 ComboBox 的项目。

    这只是一个简短的示例:

    private uint _ID;
    public uint ID
    {
        get { return _ID; }
        set
        {
            if (_ID == value) return;
            _ID = value;
            NotifyOfPropertyChange("ID");
            // Do something with your second ComboBox.
            // You could create another ObservableCollection and bind that to your second                   ComboBox and add some items representing the Account IDs
        }
    }
    

    进行更改时不要忘记通知您的View

    如果这不是您要寻找的答案,请更具体。您的实际问题很难阅读,我只理解了第一段并解释了如何归档您想做的事情。

    【讨论】:

    • 睡一觉后我同意你的观点,我想要的是更简单的东西,我会再写一个问题,谢谢