WPF单选按钮 - MVVM - 绑定似乎死了?

时间:2010-09-20 09:53:54

标签: .net wpf mvvm binding radio-button

我已将以下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;
        }
    }
}

IsMonkeyIsTurtle的集合上设置断点,然后运行应用程序并在彼此之后选择IsMonkeyIsTurtle我发现它适用于第一个选择每个控件,在第二个选择中,绑定断点和断点不再被触发?

有人能指出我正确的方向吗?

3 个答案:

答案 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。