在我的视图模型中:
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}"/>
位于我使用自定义控件的页面中。
答案 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,但它似乎被拒绝了。