【问题标题】:WPF Radio button does not update after several binding多次绑定后WPF单选按钮不更新
【发布时间】:2018-06-22 17:05:31
【问题描述】:

我有一个允许用户前进和后退的应用程序
单选按钮的实现如下:


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



以下是导航系统:

模型和视图基于 Next/Back 按钮绑定

复选框工作正常! 请给我一些建议。
提前致谢

【问题讨论】:

  • 也许您应该提供有关“导航系统”和视图模型的更多详细信息。没有它们,很难找到问题的原因。
  • 我添加了导航系统

标签: wpf binding radio-button


【解决方案1】:

我终于找到了答案:

如果您尝试在 WPF 中将 RadioButton 的 IsChecked 属性绑定到对象,您很可能遇到以下问题:在 OneWay 绑定中效果很好。但是,如果您有多个 RadioButtons 绑定了 TwoWay,并且您单击了一个未选中的 RadioButton,那么您期望先前选中的 RadioButton 绑定到的对象接收 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 属性。 享受?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多