数据绑定单选按钮“仅选择”一次
本文关键字:仅选择 一次 选择 单选按钮 数据绑定 | 更新日期: 2023-09-27 18:36:33
我在数据绑定方面有问题。我正在使用 MVVM Light。
当我在视图模型中其中一个布尔值的 setter 上设置断点并选择相应的单选按钮时,调试器将停止,一切看起来都正常。
然后,当我继续时,选择另一个单选按钮并再次选择第一个单选按钮,调试器不会停止。出了什么问题?
我有两个单选按钮:
<RadioButton Margin="5" Grid.Row="1" Content="Browser cookies" GroupName="loginmethod" IsChecked="{Binding IsBrowserCookiesChecked}"/>
<RadioButton Margin="5" Grid.Row="2" Content="Username + password" GroupName="loginmethod" IsChecked="{Binding IsUsernamePasswordChecked}"/>
在我的视图模型中,我将它们绑定到两个单独的布尔值,如下所示:
public const string IsUsernamePasswordCheckedPropertyName = "IsUsernamePasswordChecked";
private bool _isUsernamePasswordChecked = false;
public bool IsUsernamePasswordChecked
{
get
{
return _isUsernamePasswordChecked;
}
set
{
if (_isUsernamePasswordChecked == value)
{
return;
}
RaisePropertyChanging(IsUsernamePasswordCheckedPropertyName);
_isUsernamePasswordChecked = value;
RaisePropertyChanged(IsUsernamePasswordCheckedPropertyName);
}
}
public const string IsBrowserCookiesCheckedPropertyName = "IsBrowserCookiesChecked";
private bool _isBrowserCookiesChecked = true;
public bool IsBrowserCookiesChecked
{
get
{
return _isBrowserCookiesChecked;
}
set
{
if (_isBrowserCookiesChecked == value)
{
return;
}
RaisePropertyChanging(IsBrowserCookiesCheckedPropertyName);
_isBrowserCookiesChecked = value;
RaisePropertyChanged(IsBrowserCookiesCheckedPropertyName);
}
}
我发现,当您对单选按钮进行数据绑定时,为每个按钮提供不同的GroupName
要容易得多,这样它们就不会相互影响,然后仅通过绑定来处理每个单选按钮选择的设置和取消设置。例如,您可以在视图模型上只公开一个布尔值,将一个单选按钮绑定到该布尔值,然后将另一个按钮绑定到同一个布尔值,但使用反向布尔转换器。或者使该属性成为枚举,然后将每个单选按钮分配给该属性,但使用枚举到布尔转换器。然后,您还可以获得在视图模型上担心更少的属性的额外好处。
当您为单选按钮提供相同的组名时,每次更改一个属性时,WPF 都会尝试弄乱其他属性,您可能会得到一些丑陋的循环和奇怪的行为。