数据问题将ViewModel绑定到UserControl的后端属性UserControl的依赖属性

时间:2011-03-03 19:28:56

标签: .net wpf data-binding mvvm

我正在尝试将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>

2 个答案:

答案 0 :(得分:0)

绑定机制捕获进程中抛出的异常,并仅在“输出”窗口中显示它们。你检查输出窗口是否有错误?

答案 1 :(得分:0)

原来这是一个PEBKEC问题 - 我在某个地方设置了一个默认值,所以OnNotifyPropertyChanged从未被调用过,因此看起来绑定被破坏了。

我将我的布尔值绑定到View上的一个复选框,并使用UI控件更改强制我的动画更改的值,正确的代码隐藏绑定是我的第一次尝试:

SetBinding(IsInInputModeProperty, "IsInInputMode");