我在WPF中有一个列表视图,其中包含一个可观察到的对象集合。 这些对象是简单的矩形框,其中包含一组单选按钮:
通过将xaml中的'GroupName'设置为GroupName="Numbers"
或GroupName="Letters"
来使两组单选按钮保持分开
-编辑- 根据要求,这是MyObject中用于单选按钮的代码:
<RadioButton Grid.Column="1" Grid.Row="1" GroupName="Numbers" IsChecked="{Binding IsOne, Mode=TwoWay}" />
<RadioButton Grid.Column="2" Grid.Row="1" GroupName="Numbers" IsChecked="{Binding IsOne, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />
<RadioButton Grid.Column="1" Grid.Row="2" GroupName="Letters" IsChecked="{Binding IsA, Mode=TwoWay}" />
<RadioButton Grid.Column="2" Grid.Row="2" GroupName="Letters" IsChecked="{Binding IsA, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />
取反布尔转换器仅返回布尔值的倒数。
-结束编辑-
当我的列表视图中有两个这些对象的列表时,就会出现问题。例如,第一个对象(对象1)已选择“一个”和“ A”。 如果然后在对象2中选择“ B”,则该选择还将尝试更改对象1(将所有内容弄乱了) 这是我希望实现的示例:
有人看到过这种行为吗?在winforms上,可以通过为每个项目设置一个新的BindingContext来解决此问题,但是我不知道WPF中的设置是否相同。
我在完全MVVM环境中工作,这是列表视图的代码:
<ListView Name="ObjectsListView" ItemsSource="{Binding MyObjectList}" SelectedItem="{Binding SelectedObject, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ContentControl>
<local:MyObject DataContext="{Binding}"/>
</ContentControl>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
请有人让我知道如何在列表视图项中实现单独的行为吗?
谢谢。
答案 0 :(得分:2)
问题是列表视图的每个项目都创建了具有相同GroupName的单选按钮,在wpf中,只能从组中选择一个单选按钮。 因此,如果您有两个或多个项目,则单选按钮将属于一个公共组。
解决方案: 我向Model(您的SelectObject类)添加了两个新属性
private string _NameFirst;
public string NameFirst
{
get { return _NameFirst; }
set
{
if (value != _NameFirst)
{
_NameFirst = value;
NotifyPropertyChanged();
}
}
}
private string _NameSecond;
public string NameSecond
{
get { return _NameSecond; }
set
{
if (value != _NameSecond)
{
_NameSecond = value;
NotifyPropertyChanged();
}
}
}
列表中的每个模型项都应具有不同的NameFirst和NameSecond,这样做的方式有多种。例如item1:(NameFirst =“ A1”,NameSecond =“ B1”),item2:(NameFirst =“ A2”,NameSecond =“ B2”。
我还修改了ListView的ContentControl,仅为了简单起见,我将其修改为StackPanel,您也可以使用网格。
<StackPanel>
<RadioButton Grid.Column="0" Content="One" Grid.Row="0" GroupName="{Binding NameFirst}" IsChecked="{Binding IsOne, Mode=TwoWay}" />
<RadioButton Content="Two" GroupName="{Binding NameFirst}" IsChecked="{Binding IsOne, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />
<RadioButton Content="A" GroupName="{Binding NameSecond}" IsChecked="{Binding IsA, Mode=TwoWay}" />
<RadioButton Content="B" GroupName="{Binding NameSecond}" IsChecked="{Binding IsA, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />
</StackPanel>