我有一个带有标签的用户控件(下一个UC)。我需要在按钮上单击以更改UC标签内容。在后面的UC代码上,我创建 DependencyProperty 和更改标签的方法。
public string InfoLabel
{
get
{
return (string)this.GetValue(InfoLabelProperty);
}
set
{
this.SetValue(InfoLabelProperty, value);
}
}
private static void InfoLabelChangeCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
UserControl1 uc = d as UserControl1;
uc.CInfoLabel.Content = uc.InfoLabel;
}
public static readonly DependencyProperty InfoLabelProperty = DependencyProperty.Register("InfoLabel", typeof(string), typeof(UserControl1), new PropertyMetadata("", new PropertyChangedCallback(InfoLabelChangeCallback)));
在ShellView上,我在控件和按钮上具有绑定(bind)功能。
<c:UserControl1 InfoLabel="{Binding InfoLabel1}" />
<Button x:Name="ChangeUserControllButton"/>
在ShellViewModel上,我具有Binding InfoLabel1 。
private string infoLabel= "something";
public string InfoLabel1
{
get
{
return infoLabel;
}
set
{
infoLabel = value;
}
}
public void ChangeUserControllButton()
{
InfoLabel1 = "Hello world";
}
问题是当 UC 初始化后,它就可以工作了。我的意思是,来自UC的标签将具有内容“某物” ,但是当我单击按钮时,内容不会更改为“Hello world”。如何使它正确?
最佳答案
View 模型需要实现INotifyPropertyChanged
,以便能够通知UI刷新/更新,因为绑定(bind)模型已更改。我相信已经有一个提供该功能的基类。
引用Caliburn.Micro.PropertyChangedBase
将ShellViewModel
更新为要从PropertyChangedBase
派生,然后在属性调用中使用一种可用方法,该方法可使您的 View 模型向UI通知属性已更改。
public class ShellViewModel : PropertyChangedBase {
private string infoLabel= "something";
public string InfoLabel1 {
get {
return infoLabel;
}
set {
infoLabel = value;
NotifyOfPropertyChange();
//Or
//Set(ref infoLabel, value);
}
}
public void ChangeUserControllButton() {
InfoLabel1 = "Hello world";
}
}
在https://caliburnmicro.com/上了解更多信息,以获取有关如何使用该框架的示例。
关于c# - 如何在MVVM Caliburn.Micro中绑定(bind)用户控件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48207343/