Радио кнопки WPF - MVVM - привязка, кажется, умирает? - PullRequest
7 голосов
/ 20 сентября 2010

Я связал 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 друг за другом, я обнаружил, что он работает для первого выбора каждого элемента управления, на втором выделение разрывов привязки и точек останова больше не срабатывает?

Может кто-нибудь указать мне правильное направление, пожалуйста?

Ответы [ 3 ]

10 голосов
/ 20 сентября 2010

В вашем примере нет уведомлений об изменениях. Вы написали, что это только пример конструкции в стиле 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}

Надеюсь, это помогло.

2 голосов
/ 20 сентября 2010

Это известная проблема с переключателями 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/

0 голосов
/ 22 мая 2015

Эта проблема была исправлена ​​в WPF 4.0, сейчас я использую это поведение в своем собственном проекте.Просто поместите переключатели в одну группу, больше нет необходимости использовать разные имена групп.Привязки не будут нарушены ... на самом деле, для радио-кнопки "de-selected" будет присвоено значение привязки, равное false, как и ожидалось.

...