簡體   English   中英

UWP:綁定以查看模型屬性

[英]UWP: binding to view model property

在我看來,模型:

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}"/>

在我使用自定義控件的頁面中。

您的類應實現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}"

備注:

模式= TwoWay-如果一個屬性更改,則屬性將同時在UI和代碼中更改。 UpdateSourceTrigger-對PropertyChanged事件作出反應。 另外,請閱讀有關DataContext的信息:)

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

實現起來很簡單。

[AddINotifyPropertyChangedInterface]
public class MyViewModel
{
    public string MyProperty { get; set; }

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

正如@DavidHruška所說,也可以在XAML中編輯綁定。

您的設置者需要顯式調用Observable.Set()方法:

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

不幸的是,汽車無法為您實現INPC,因此您無法使用它們。 Microsoft將此作為功能請求 ,但似乎已被拒絕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM