我有一个允许用户向前和向后移动的应用程序
单选按钮的实现方式如下:
对于前4次,我更改了单选按钮的选定项,然后移动到下一步,然后再次执行相同的操作,单选按钮可以正常工作,并且模型已正确更新为其GUI。但是,在前4次前后移动之后,单选按钮不会更新其GUI。
基于“下一个/后退”按钮绑定模型和视图
复选框可以正常工作!
请给我一些建议。
预先感谢
答案 0 :(得分:2)
我终于找到了答案:
如果您试图将WPF中RadioButton的IsChecked属性绑定到对象,则很可能会遇到以下问题:在OneWay绑定中,它的效果很好。但是,如果您有多个绑定到TwoWay的RadioButtons,并且单击了未选中的那个,则您希望先前绑定了RadioButton的对象绑定到该对象时会收到False的值。但是您的期望是错误的。这是因为出于某些原因,Microsoft不遵守绑定,也没有将False值传递给DependencyProperty,而是直接将False值直接分配给属性,这破坏了绑定。
Internet上有许多提议的解决方案,所有这些的问题在于它们不适用于动态生成的控件。因此,由于我必须找到一种方法来使它与动态控件一起使用,因此决定制作一个真正的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属性。 享受