UWP:绑定到视图模型属性

时间:2017-12-21 13:01:41

标签: c# mvvm uwp

在我的视图模型中:

public string MyProperty{ get; set; }

public MyViewModel()
{
     MyProperty = "hello";
}

我已经定义了一个字符串属性。

现在,从我的页面,我想绑定到这个属性:

Text="{Binding MyProperty}"

但这不起作用 - 没有显示任何文字。我错过了什么?

编辑: 我的视图模型继承自:

public class Observable : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
        {
            if (Equals(storage, value))
            {
                return;
            }

            storage = value;
            OnPropertyChanged(propertyName);
        }

        protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

编辑2:

我修改了我的视图模型:

private string _myProperty;

        public string MyProperty
        {
            get => _myProperty;
            set => Set(ref _myProperty, value);
        }

        public MyViewModel()
        {
            _myProperty = "hello";
        }

和xaml:

Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

但它仍无效。

编辑3:我认为问题是Text属性是自定义控件的注册依赖项属性:

public sealed partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
            DataContext = this;
        }

        public string Text
        {
            get => (string)GetValue(s_textProperty);
            set => SetValue(s_textProperty, value);
        }

        public static readonly DependencyProperty s_textProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(MyControl), new PropertyMetadata(null));
    }

在控件的xaml中我有:

<TextBlock Text="{Binding Text}" />

此:

<MyControl Text="{Binding MyProperty}"/>

位于我使用自定义控件的页面中。

3 个答案:

答案 0 :(得分:3)

你的班级应该实现INotifyPropertyChanged并拥有如下属性访问者:

public event PropertyChangedEventHandler PropertyChanged;

private string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set
    {
        _myProperty = value;
        OnPropertyChanged();
    }
}

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

在XAML中:

Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

说明:

Mode = TwoWay - 如果由任何一个更改,属性将在UI和代码中更改。 UpdateSourceTrigger - 对PropertyChanged事件做出反应。 另外,请阅读DataContext:)

答案 1 :(得分:3)

我建议添加PropertyChanged.Fody Nuget(https://www.nuget.org/packages/PropertyChanged.Fody/

实现起来很简单。

groupuserdetails_table (groupid, userid, role status)

正如@DavidHruška所说,也在XAML中编辑绑定。

答案 2 :(得分:2)

你的setter需要显式调用Observable.Set()方法:

private string _myProperty;
public string MyProperty
{ 
   get {  return _myProperty; }
   set { this.Set<string>(ref _myProperty, value); }
}

不幸的是,汽车没有为您实施INPC,因此您无法使用它们。微软将此作为feature request,但它似乎被拒绝了。