我已将以下Window的DataContext
绑定到后面的代码,以便为我提供MVVM style
来演示此行为:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<StackPanel>
<RadioButton GroupName="test" Content="Monkey" IsChecked="{Binding IsMonkey}"/>
<RadioButton GroupName="test" Content="Turtle" IsChecked="{Binding IsTurtle}" />
</StackPanel>
</Window>
背后的代码:
public partial class Window1
{
public Window1()
{
InitializeComponent();
}
private bool _isMonkey;
public bool IsMonkey
{
get { return _isMonkey; }
set
{
_isMonkey = value;
}
}
private bool _isTurtle;
public bool IsTurtle
{
get { return _isTurtle; }
set
{
_isTurtle = value;
}
}
}
在IsMonkey
和IsTurtle
的集合上设置断点,然后运行应用程序并在彼此之后选择IsMonkey
和IsTurtle
我发现它适用于第一个选择每个控件,在第二个选择中,绑定断点和断点不再被触发?
有人能指出我正确的方向吗?
答案 0 :(得分:10)
您的示例没有更改通知。你写的只是MVVM风格结构的一个例子。因此,我假设您已实现INotifyPropertyChanged
或属性为DependencyProperties。如果没有,你要做的第一件事就是改变通知。
如果您有更改通知,为RadioButtons提供不同的组名(每个实例的另一个名称)。这将它们分离,并且绑定将不再被破坏。
<StackPanel>
<RadioButton GroupName="test1" Content="Monkey" IsChecked="{Binding IsMonkey}"/>
<RadioButton GroupName="test2" Content="Turtle" IsChecked="{Binding IsTurtle}" />
</StackPanel>
根据您的属性的声明,声明Binding TwoWay也可能是有意义的。
IsChecked="{Binding IsMonkey,Mode=TwoWay}
希望这会有所帮助。
答案 1 :(得分:2)
这是WPF单选按钮的已知问题;查看这些帖子了解更多详情和解决方法 -
WPF RadioButtons和数据绑定:http://geekswithblogs.net/claraoscura/archive/2008/10/17/125901.aspx
Parsimony WPF单选按钮绑定(枚举和错误修复): http://inquisitorjax.blogspot.com/2009/02/wpf-radio-button-binding-enums-and-bug.html
RadioButton未经检查的绑定问题仍未解决? http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8eb8280a-19c4-4502-8260-f74633a9e2f2/
答案 2 :(得分:0)
此问题已在WPF 4.0中修复,我现在正在自己的项目中利用此行为。只需将单选按钮放在同一组中,就不再需要使用不同的组名。绑定不会被破坏......实际上&#34;取消选择&#34;单选按钮的绑定值将按预期设置为false。