【问题标题】:Binding to custom MVVM control绑定到自定义 MVVM 控件
【发布时间】:2015-02-15 10:35:13
【问题描述】:

我有使用 MVVM 的自定义用户控件:INotifyPropertyChanged。我的应用程序还使用 MVVM 和 INotifyPropertyChanged,但是当我尝试将值绑定到自定义用户控件时,应用程序失败。

“异常未能分配给属性 '%0'。”

我需要使用双向绑定。谢谢你的帮助。

自定义用户控件

    private double _value = 0;
    public double Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
            RaisePropertyChanged("Value");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

绑定到元素:

    private double _startMinutes;
    public double StartMinutes
    {
        get
        {
            return _startMinutes;
        }
        set
        {
            _startMinutes = value;
            RaisePropertyChanged("StartMinutes");
        }
    }

    <controls:RadialSlider
        Value="{Binding StartMinutes}"
    />

【问题讨论】:

  • 我在该代码中没有看到名为StartMinutes 的属性,只有Value。不匹配会导致问题。
  • 不,我用应用程序的 MVVM 中声明的 StartMinutes 值更新了问题。
  • 您的用户控件上没有Value DP?这甚至可以编译吗?如果您有一个,则支持属性可能会与发布的属性发生冲突。
  • 我不使用 DP,我试过了,但是值没有改变。我应该如何使用它?

标签: c# mvvm binding windows-phone-8.1 inotifypropertychanged


【解决方案1】:

您不能只绑定到普通属性。

绑定是通过DependencyProperty 完成的。最快的制作方法是通过propdp sn-p。它们看起来像:

    public double Value
    {
        get { return (double)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(double), typeof(RadialSlider), new PropertyMetadata(0));

现在您的绑定将按预期工作。更多信息请见MSDN

【讨论】:

  • 不幸的是,抛出了同样的异常“Exception Failed to assign to property '%0'。”
  • @bojo 还有任何其他信息吗?上面有任何 System.Data 异常吗?我没有足够的信息来提出任何其他建议。
  • 请编辑您的答案。应使用此方法设置值 private void SetValueDp(DependencyProperty property, object value, [System.Runtime.CompilerServices.CallerMemberName] String p = null) { SetValue(property, value); if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(p));并且用户控件的数据上下文也应该这样设置(this.Content as FrameworkElement).DataContext = this;
  • @bojo 我感谢您的意见,但您的第一个方法不应该是必要的,因为您的 DP 不应该提高 PropertyChanged。您的“DataContext”行说明了为什么会这样,您不应该永远将视图的数据上下文设置为后面的代码。 DataContext 应该始终在视图模型中。我不想在我的回答中鼓励不良做法,所以我想在编辑之前澄清这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2013-03-29
  • 2019-09-07
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多