绑定到UserControl的属性

时间:2016-06-20 13:45:48

标签: c# wpf data-binding user-controls

我编写了一个包含大量内容的小部件,它包含一个从UC类内部更新的属性(DependencyProperty)(基于输入被输入到文本框中,输入来自按钮点击等等。)其定义是:

public partial class UserControlClassName : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    } 

    public static readonly DependencyProperty ValueProperty = System.Windows.DependencyProperty.Register("Value", typeof(string), typeof(UserControlClassName), new PropertyMetadata(string.Empty, OnValueChanged));

    public string Value
    {
        get { return (string)GetValue(ValueProperty); }
        set 
        { 
            SetValue(ValueProperty, value);
            NotifyPropertyChanged("Value");
        }
    }

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue != null && e.NewValue != e.OldValue)
        {
            Console.Out.WriteLine("new value: " + e.NewValue);
        }
    }

   ...
   ...
   lots of other code that updates the Value property..
   ...
   ...

}

我在某个窗口的XAML中实例化UC,如下所示:

<GeneralControls:UserControlClassName
            x:Name="someRandomName"
            Value="{Binding MyViewModel.MyBoundedValueField, StringFormat=N2, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DebugBinding}}"
            VerticalAlignment="Bottom" />

为了完成图片,这是我用来“抓住”价值的视图模型的属性:

public string MyBoundedValueField
    {
        get { return myBoundedValueField; }
        set
        {
            if (myBoundedValueField!= value)
            {
                myBoundedValueField = value;
                OnPropertyChanged("MyBoundedValueField");
            }
        }
    }

我的问题是 - 用户控件执行内部的Value属性得到更新,但是我在xaml(myBoundedValueField)中绑定的外部属性没有得到更新...绑定到这个依赖属性不起作用 - 所以我附加了一个转换器来调试它,并且转换器没有被调用,因此它肯定是一个错误的绑定设置..

(Tnx给任何帮助的人!)

1 个答案:

答案 0 :(得分:0)

解决方案最终是添加Mode = TwoWay

<GeneralControls:UserControlClassName
    x:Name="someRandomName"
    Mode=TwoWay
    Value="{Binding MyViewModel.MyBoundedValueField, StringFormat=N2, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DebugBinding}}"
    VerticalAlignment="Bottom" />

我不知道为什么绑定在没有它的情况下不起作用 - 我希望听到一个解释,如果任何人可以对这个主题有所了解......

特别感谢@Clemens !!!