我正在尝试将ViewModel的IsInInputMode
属性绑定到UserControl中的Dependency属性。我正在将UserControl的DataContext设置为我的ViewModel的一个实例,并且所有基于XAML的绑定都正常工作。我需要一个代码隐藏解决方案来创建这个绑定。我已经尝试了一些没有效果的东西(在帖子的底部)。
我也没有将任何异常记录到输出窗口,这是我被告知要查找基于绑定的异常的地方。
我问这个类似question,在通过XAML绑定UserControl中的依赖属性时 - 我被告知这是不可能的,所以我正在寻找一个代码隐藏解决方案。
ViewModel如下所示:
class AddClientViewModel : ViewModelBase
{
private Boolean _isInInputMode;
public Boolean IsInInputMode
{
get { return _isInInputMode; }
set
{
_isInInputMode = value;
OnPropertyChanged("IsInInputMode");
}
}
public ICommand Cancel
{
get { return new RelayCommand(parm => { IsInInputMode = false; }); }
}
}
Cancel
命令通过XAML成功绑定到Button的命令。
UserControl中的Dependency属性如下所示:
public bool IsInInputMode
{
get { return (bool)GetValue(IsInInputModeProperty); }
set { SetValue(IsInInputModeProperty, value); }
}
public static readonly DependencyProperty IsInInputModeProperty =
DependencyProperty.Register("IsInInputMode", typeof(bool), typeof(AddClientView), new UIPropertyMetadata(new PropertyChangedCallback(_OnIsInInputModePropertyChanged)));
private static void _OnIsInInputModePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var mycontrol = d as AddClientView;
bool oldValue = (bool)e.OldValue;
bool newValue = (bool)e.NewValue;
if (null != mycontrol && oldValue != newValue)
{
mycontrol._OnIsInInputModeChanged(oldValue, newValue);
}
}
private void _OnIsInInputModeChanged(bool oldValue, bool newValue)
{
if (newValue)
{
VisualStateManager.GoToState(this, "InputState", false);
}
else
{
VisualStateManager.GoToState(this, "HiddenState", false);
}
}
我的UserControl的构造函数中的绑定已经进行了几次迭代。
首先尝试:
public AddClientView()
{
InitializeComponent();
SetBinding(IsInInputModeProperty, "IsInInputMode");
}
第二次尝试:
public AddClientView()
{
InitializeComponent();
var b = new Binding();
b.Source = this.DataContext;
b.Path = new PropertyPath("IsInInputMode");
b.Mode = BindingMode.TwoWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(this, IsInInputModeProperty, b);
}
这些都没有“失败”的编译器或运行时错误;但是当ViewModel中的IsInInputMode属性发生更改时,依赖项属性永远不会更新,并且永远不会调用两个偶数处理程序。
作为补充说明,ViewModel有一些ICommand
属性, 通过XAML成功绑定到UserControl中的按钮 - 所以我知道DataContext绑定正确。< / p>
答案 0 :(得分:0)
绑定机制捕获进程中抛出的异常,并仅在“输出”窗口中显示它们。你检查输出窗口是否有错误?
答案 1 :(得分:0)
原来这是一个PEBKEC问题 - 我在某个地方设置了一个默认值,所以OnNotifyPropertyChanged从未被调用过,因此看起来绑定被破坏了。
我将我的布尔值绑定到View上的一个复选框,并使用UI控件更改强制我的动画更改的值,正确的代码隐藏绑定是我的第一次尝试:
SetBinding(IsInInputModeProperty, "IsInInputMode");