WPF DataGrid Combobox selectedItem

时间:2014-04-14 19:45:30

标签: c# wpf xaml datagrid observablecollection

我有一个DataGrid,其组合框分配有客户ID,每个客户ID可能有许多帐户ID,这些帐户ID在他们自己的组合框中分配。我想要做的就是,当用户从组合框中选择客户ID时,帐户ID随后会被选择的特定CustomerID更新。

我想我差不多有代码了。

这里我在combobox elementstyle中应用了customerId的itemsource。如您所见,当从客户框中选择一个Item时,我有一个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>

因此,在帐户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> 

但是我可能会离开,所以任何帮助我都会感激不尽。

由于

1 个答案:

答案 0 :(得分:0)

<Setter Property="ItemsSource" Value="{Binding DataContext.EntityCollection,

我不完全确定这是否可行,但我不建议这样使用。

将代码中的ViewModel绑定到DataContext的{​​{1}}。现在,您可以将ItemsSource绑定到ViewModel中的任何ObservableCollection属性。这可能是你的View

好吧,使用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

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