更改WPF DataGrid中其他ComboBox的值

时间:2017-11-02 15:49:38

标签: c# wpf combobox datagrid observablecollection

这是我的问题。 我将数据从Web服务器(带有Web请求)提取到ObservableCollection

ObservableCollection<TestData> fillData = new ObservableCollection<TestData>();

从那里我用信息填充数据网格。该数据网格中的一个字段是组合框。根据获取的数据量,您可以拥有多行数据。

 <DataGridTemplateColumn Header="Role">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Role}">
                            </TextBlock>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{StaticResource RoleList}" SelectedItem="{Binding Role}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>

组合框可以有3个值。小学,中学和借阅。当你更改组合框内的值时,ObservableCollection会像它应该的那样更新。 问题在于您只能选择一个主节点,因此当您将其中一个组合框的值更改为主节点时,我的ObservableCollection中有2个或更多个主节点。

我正在寻找一种方法,当您将其中一个组合框的值更改为primary时,其他值也是datagrid(组合框)中的主要值将更改为secondary。这样你当时只有一个小学。 我有点失落,希望有人能给我一些提示。 :)

2 个答案:

答案 0 :(得分:0)

你应该考虑一下事件。

当更改Role属性或更改任何Combobox SelectedValue时,您需要遍历列表并进行所需的任何更改。

您可以为组合框SelectionChanged事件添加一个事件处理程序,然后进行检查 或者也许是网格数据源的ObservableCollection.CollectionChanged。

答案 1 :(得分:0)

以下是您如何做到这一点的一个例子。

在任何给定的行项集合中(无论您在ObservableCollection中调用该类),集合中的所有项都必须引用同一RoleCoordinator实例。实现这一目标的方法不止一种;您可以使RoleCoordinator成为行项的公共属性,在ObservableCollection上处理CollectionChanged,并在每个项目添加到集合时为其提供角色协调员。在这里,我只是将它传递给构造函数,因为我在我的窗口构造函数中静态初始化集合以进行测试。

public class RoleCoordinator
{
    public event EventHandler<RoleChangedEventArgs> RoleChanged;

    public void RaiseRoleChanged(object sender, Role role)
    {
        RoleChanged?.Invoke(sender, new RoleChangedEventArgs(role));
    }
}

public class RoleChangedEventArgs : EventArgs
{
    public RoleChangedEventArgs(Role role)
    {
        Role = role;
    }

    public Role Role { get; set; }
}

行项目视图模式

public class RowItemViewModel : ViewModelBase
{
    public RowItemViewModel(RoleCoordinator coordinator)
    {
        _roleCoordinator = coordinator;

        _roleCoordinator.RoleChanged += _roleCoordinator_RoleChanged;
    }

    #region Role Coordination
    private void _roleCoordinator_RoleChanged(object sender, RoleChangedEventArgs e)
    {
        if (sender != this && e.Role == Role.Primary && this.Role == Role.Primary)
        {
            Role = Role.Secondary;
        }
    }

    private RoleCoordinator _roleCoordinator;
    #endregion Role Coordination

    #region Role Property
    private Role _role = default(Role);
    public Role Role
    {
        get { return _role; }
        set
        {
            if (value != _role)
            {
                _role = value;

                _roleCoordinator.RaiseRoleChanged(this, this.Role);

                OnPropertyChanged();
            }
        }
    }
    #endregion Role Property