WPF单选按钮在多次绑定后不更新

WPF单选按钮在多次绑定后不更新,wpf,binding,radio-button,Wpf,Binding,Radio Button,我有一个允许用户前后移动的应用程序 单选按钮的实现方式如下: 在前4次中,我更改单选按钮的选定项,然后移动下一步,然后返回并执行相同操作,单选按钮工作正常,模型作为其GUI正确更新。但是,在前4次前后移动后,单选按钮不会更新其GUI 以下是导航系统: 模型和视图基于“下一步/上一步”按钮进行绑定 检查箱工作正常! 请给我一些建议。 提前感谢我终于找到了答案: 如果您尝试将WPF中RadioButton的IsChecked属性绑定到对象,那么您很可能遇到了以下问题:在单向绑定中,它工作得

我有一个允许用户前后移动的应用程序
单选按钮的实现方式如下:


在前4次中,我更改单选按钮的选定项,然后移动下一步,然后返回并执行相同操作,单选按钮工作正常,模型作为其GUI正确更新。但是,在前4次前后移动后,单选按钮不会更新其GUI



以下是导航系统:

模型和视图基于“下一步/上一步”按钮进行绑定

检查箱工作正常! 请给我一些建议。

提前感谢

我终于找到了答案:

如果您尝试将WPF中RadioButton的IsChecked属性绑定到对象,那么您很可能遇到了以下问题:在单向绑定中,它工作得很好。但是,如果有多个单选按钮被双向绑定,并且单击了未选中的单选按钮,则您希望先前选中的单选按钮绑定到的对象接收False值。但你的期望是错误的。这是因为出于某些原因,Microsoft不遵守绑定,也不将False值传递给DependencyProperty,相反,他们只是将False值直接分配给属性,这会破坏绑定

在互联网上有很多建议的解决方案,所有这些的问题是它们不能与动态生成的控件一起工作。因此,由于我必须找到一种方法使它与动态控件一起工作,所以我决定制作一个真正的RadioButton的包装,它将以两种方式正确绑定。以下是包装器的代码:

using System;
using System.IO;
using System.Printing;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using Microsoft.Win32;

namespace Controls
{
    public class RadioButtonExtended : RadioButton
    {
        static bool m_bIsChanging = false;

        public RadioButtonExtended()
        {
            this.Checked += new RoutedEventHandler(RadioButtonExtended_Checked);
            this.Unchecked += new RoutedEventHandler(RadioButtonExtended_Unchecked);
        }

        void RadioButtonExtended_Unchecked(object sender, RoutedEventArgs e)
        {
            if (!m_bIsChanging)
                this.IsCheckedReal = false;
        }

        void RadioButtonExtended_Checked(object sender, RoutedEventArgs e)
        {
            if (!m_bIsChanging)
                this.IsCheckedReal = true;
        }

        public bool? IsCheckedReal
        {
            get { return (bool?)GetValue(IsCheckedRealProperty); }
            set
            {
                SetValue(IsCheckedRealProperty, value);
            }
        }

        // Using a DependencyProperty as the backing store for IsCheckedReal. This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsCheckedRealProperty =
        DependencyProperty.Register("IsCheckedReal", typeof(bool?), typeof(RadioButtonExtended),
        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Journal |
        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
        IsCheckedRealChanged));

        public static void IsCheckedRealChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            m_bIsChanging = true;
            ((RadioButtonExtended)d).IsChecked = (bool)e.NewValue;
            m_bIsChanging = false;
        }
    }
}
所以现在您所要做的就是使用ExtendedRadioButton而不是内置的,并绑定到IsCheckedReal属性而不是IsChecked属性。
享受我终于找到了答案:

如果您尝试将WPF中RadioButton的IsChecked属性绑定到对象,那么您很可能遇到了以下问题:在单向绑定中,它工作得很好。但是,如果有多个单选按钮被双向绑定,并且单击了未选中的单选按钮,则您希望先前选中的单选按钮绑定到的对象接收False值。但你的期望是错误的。这是因为出于某些原因,Microsoft不遵守绑定,也不将False值传递给DependencyProperty,相反,他们只是将False值直接分配给属性,这会破坏绑定

在互联网上有很多建议的解决方案,所有这些的问题是它们不能与动态生成的控件一起工作。因此,由于我必须找到一种方法使它与动态控件一起工作,所以我决定制作一个真正的RadioButton的包装,它将以两种方式正确绑定。以下是包装器的代码:

using System;
using System.IO;
using System.Printing;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using Microsoft.Win32;

namespace Controls
{
    public class RadioButtonExtended : RadioButton
    {
        static bool m_bIsChanging = false;

        public RadioButtonExtended()
        {
            this.Checked += new RoutedEventHandler(RadioButtonExtended_Checked);
            this.Unchecked += new RoutedEventHandler(RadioButtonExtended_Unchecked);
        }

        void RadioButtonExtended_Unchecked(object sender, RoutedEventArgs e)
        {
            if (!m_bIsChanging)
                this.IsCheckedReal = false;
        }

        void RadioButtonExtended_Checked(object sender, RoutedEventArgs e)
        {
            if (!m_bIsChanging)
                this.IsCheckedReal = true;
        }

        public bool? IsCheckedReal
        {
            get { return (bool?)GetValue(IsCheckedRealProperty); }
            set
            {
                SetValue(IsCheckedRealProperty, value);
            }
        }

        // Using a DependencyProperty as the backing store for IsCheckedReal. This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsCheckedRealProperty =
        DependencyProperty.Register("IsCheckedReal", typeof(bool?), typeof(RadioButtonExtended),
        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Journal |
        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
        IsCheckedRealChanged));

        public static void IsCheckedRealChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            m_bIsChanging = true;
            ((RadioButtonExtended)d).IsChecked = (bool)e.NewValue;
            m_bIsChanging = false;
        }
    }
}
所以现在您所要做的就是使用ExtendedRadioButton而不是内置的,并绑定到IsCheckedReal属性而不是IsChecked属性。
享受吧,也许你应该提供更多关于“导航系统”和视图模型的详细信息。如果没有它们,很难找到问题的原因。我添加了导航系统。也许您应该提供有关“导航系统”和视图模型的更多详细信息。没有它们很难找到问题的原因。我添加了导航系统来源:来源: