我的观点
<UserControl x:Class="Views.PartView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:viewModels="clr-namespace:EComponents.ViewModels"
mc:Ignorable="d"
x:Name="PartUc"
d:DataContext="{d:DesignInstance viewModels:PartViewModel}">
<Grid>
<TextBox x:Name="NameTb" Text="{Binding Name}" />
</Grid>
</UserControl>
我的ViewModel
public class PartViewModel : ViewModel<Part>
{
public PartViewModel(Part model) : base(model)
{
PartListViewModel.OnSelectedPartChanged += PartListViewModel_OnSelectedPartChanged;
}
void PartListViewModel_OnSelectedPartChanged(Part p)
{
Model = Part.GetPart(p);
}
public string Name
{
get
{
return Model.Name;
}
set
{
if (Name != value)
{
Model.Name = value;
this.OnPropertyChanged("Name");
}
}
}
}
我的模特
public class Part
{
public string Name { get; set; }
}
我不知道为什么但是我的UserControl中的TextBox没有填充我的部分的Name属性,即使这行被调用
Model = Part.GetPart(p);
我像这样设置了我的View的DataContent
public partial class PartView : UserControl
{
public PartView()
{
InitializeComponent();
DataContext = new PartViewModel(new Part());
}
}
答案 0 :(得分:2)
在Model
中更改PartListViewModel_OnSelectedPartChanged
后,好像您没有通知用户界面。更改后,您需要为每个this.OnPropertyChanged(...)
相关属性调用Model
,或使用空参数this.OnPropertyChanged(null)
调用它以刷新所有属性
void PartListViewModel_OnSelectedPartChanged(Part p)
{
Model = Part.GetPart(p);
this.OnPropertyChanged(null);
}
答案 1 :(得分:0)
您的代码中存在轻微问题:
if (Name != value)
{
Model.Name = value;
this.OnPropertyChanged("Name");
}
应该是:
if (Model.Name != value)
{
Model.Name = value;
this.OnPropertyChanged("Name");
}
自引用视图模型的Name属性会给您带来问题。
最后但并非最不重要的是,您需要在代码隐藏中使用代码来在运行时绑定DataContext。
修改强>
我刚刚再次查看了您的代码以及对该问题的评论。在事件处理程序中设置Model的值时,还需要在那里设置DataContext。更改模型引用不会更新DataContext。