[英]Binding the current state of a VisualStateGroup to a property in the view model in a UWP MVVM app
[英]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.