我在WPF中获取数据绑定单选按钮列表框时遇到问题,以响应用户输入并反映对其绑定的数据的更改(即,在代码中进行更改)。用户输入端工作正常(即,我可以选择无线电按钮,并且列表按预期运行)。但是每次尝试更改代码中的选择都会失败。默默地(即,也不例外)。
以下是XAML的相关部分(我认为):
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border Name="theBorder" Background="Transparent">
<RadioButton Focusable="False" IsHitTestVisible="False"
IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" >
<ContentPresenter />
</RadioButton>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
我将列表框绑定到SchoolInfo对象列表。 SchoolInfo包含一个名为IsSelected的属性:
public bool IsSelected
{
get { return isSelected; }
set
{
if( value != isSelected )
{
isSelected = value;
this.OnPropertyChanged("IsSelected");
}
}
}
OnPropertyChanged()的东西是我在实验过程中放入的东西。它没有解决问题。
以下事情失败了:
((SchoolInfo) lbxSchool.Items[1]).IsSelected = true;
lbxSchool.SelectedIndex = 1;
它们无声地失败 - 没有抛出异常,但UI不显示正在选择的项目。
答案 0 :(得分:2)
RadioButton绑定到ListBoxItem IsSelected属性,而不绑定到SchoolInfo IsSelected属性。
(这很令人困惑,因为ListBoxItem有一个“IsSelected”属性,你的SchoolInfo对象也是如此,这就是没有绑定错误的原因。)
要修复,ListBoxItem.IsSelected需要绑定到您的SchoolInfo IsSelected属性。
即。您需要为ListBoxItem添加一个额外的setter来绑定到SchoolInfo.IsSelected,然后列表框项将按预期工作,并且RadioButton也可以正确绑定到ListBoxItem.IsSelected。
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
答案 1 :(得分:0)
我会在你的RadioButton绑定中启用NotifyOnSourceUpdated。即使您允许双向绑定(这是默认设置),也不会从代码隐藏更改中获取通知,除非您明确地监听它们。
<RadioButton Focusable="False" IsHitTestVisible="False"
IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, NotifyOnSourceUpdated=True}" >