在 UserControl 中绑定文本框
Bind Textbox in UserControl
我的看法
<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>
我的视图模型
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 中的文本框没有填充我的部分的名称 属性,即使这行被调用
Model = Part.GetPart(p);
我这样设置视图的数据内容
public partial class PartView : UserControl
{
public PartView()
{
InitializeComponent();
DataContext = new PartViewModel(new Part());
}
}
您的代码中有一个小问题:
if (Name != value)
{
Model.Name = value;
this.OnPropertyChanged("Name");
}
应该是:
if (Model.Name != value)
{
Model.Name = value;
this.OnPropertyChanged("Name");
}
自引用视图模型的名称 属性 会给您带来问题。
最后但同样重要的是,您需要代码隐藏中的代码在运行时绑定 DataContext。
编辑
我刚刚又看了一遍你的代码以及问题的评论。当您在事件处理程序中设置 Model 的值时,您还需要在那里设置 DataContext。更改模型引用不会更新 DataContext。
当 Model
在 PartListViewModel_OnSelectedPartChanged
中更改时,您似乎没有通知 UI。您需要在更改后为每个 Model
相关的 属性 调用 this.OnPropertyChanged(...)
或使用空参数 this.OnPropertyChanged(null)
调用它以刷新所有属性
void PartListViewModel_OnSelectedPartChanged(Part p)
{
Model = Part.GetPart(p);
this.OnPropertyChanged(null);
}
我的看法
<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>
我的视图模型
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 中的文本框没有填充我的部分的名称 属性,即使这行被调用
Model = Part.GetPart(p);
我这样设置视图的数据内容
public partial class PartView : UserControl
{
public PartView()
{
InitializeComponent();
DataContext = new PartViewModel(new Part());
}
}
您的代码中有一个小问题:
if (Name != value)
{
Model.Name = value;
this.OnPropertyChanged("Name");
}
应该是:
if (Model.Name != value)
{
Model.Name = value;
this.OnPropertyChanged("Name");
}
自引用视图模型的名称 属性 会给您带来问题。
最后但同样重要的是,您需要代码隐藏中的代码在运行时绑定 DataContext。
编辑
我刚刚又看了一遍你的代码以及问题的评论。当您在事件处理程序中设置 Model 的值时,您还需要在那里设置 DataContext。更改模型引用不会更新 DataContext。
当 Model
在 PartListViewModel_OnSelectedPartChanged
中更改时,您似乎没有通知 UI。您需要在更改后为每个 Model
相关的 属性 调用 this.OnPropertyChanged(...)
或使用空参数 this.OnPropertyChanged(null)
调用它以刷新所有属性
void PartListViewModel_OnSelectedPartChanged(Part p)
{
Model = Part.GetPart(p);
this.OnPropertyChanged(null);
}