这是我的问题。 我将数据从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。这样你当时只有一个小学。 我有点失落,希望有人能给我一些提示。 :)
答案 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