
[英]ObservableCollection Bound from ViewModel Does Not Update View
[英]View does not update with changing viewModel
我有一个名为用户控件SensorControl
,我想它的DataContext绑定到一个名为ViewModel类SensorModel
。 绑定成功,viewModel的初始值在userControl中可见,但问题是当我更改 viewModel的属性时, userControl不会更新 ,我必须手动更新它(通过为其dataContext指定null并分配再次查看viewModel)。 这是我的代码的简化示例。
SensorControl.xml:
<UserControl ...[other attributes]... DataContext={Binding Model}>
.
.
.
<Label Content="{Binding Title}"/>
.
.
.
</UserControl>
SensorControl.xml.cs(代码隐藏):
public partial class SensorControl : UserControl
{
public SensorModel model;
public SensorModel Model
{
get { return model; }
set { model = value; }
}
public SensorControl(SensorModel sm)
{
Model = sm;
}
}
MainWindow.xml.cs:
public partial class MainWindow : Window
{
public SensorModel sensorModel_1;
public SensorControl sensorControl_1;
public MainWindow()
{
InitializeComponent();
sensorModel_1 = new SensorModel(...[some arguments]...);
sensorControl_1 = new SensorControl(sensorModel_1);
mainGrid.Children.Add(sensorControl_1);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
sensorModel_1.Title = "myTitle";
//The UserControl does not update
}
0)我在SensorModel
实现了INotifyPropertyChanged
1)我需要这个的原因是,我的项目中只有一个“传感器”概念(它是一个真正的电子传感器),因此我有一个单一的模型(处理真实的传感器,数据库)等,但在UI中我有多个userControls用于呈现Sensor的不同方面。 所以我必须为每个真实传感器创建一个模型实例(SensorModel),并且多个userControl必须绑定到它(每个使用不同的模型部分)。
2)我对WPF并不陌生,但我对MVVM不熟悉并且我可能误解了必要的东西,所以如果有人能够清楚地解释正确的方法,我将不胜感激。
提前致谢
在UserControl中,删除DataContext属性并添加x:Name属性。 然后在你的Label中,像这样绑定:
<UserControl x:Name="uc">
<Label Content="{Binding ElementName=uc,Path=Model.Title}" />
</UserControl>
我认为问题是DataContext无法设置为Model,因为绑定工作在父级的DataContext上,当它作为子节点添加到主格式时将基于mainGrid。 由于maiGrid的DataContext中不存在属性“Model”,因此不会发生绑定,因此您的更新不会反映出来。 正确获取UserControl的DataContext可能很棘手。 我使用ElementName很多或在UserControl上创建DependencyProperties,然后从将使用该控件的父设置它们。
您需要在View中将DataContext
设置为ViewModel类,如果要应用MVVM模式,则应使用ICommand进行操作。 也许它会更好如果你实现了一个MainView类,它在后台而不是在MainWindow类中执行逻辑。
public MainWindow()
{
InitializeComponent();
DataContext = new MainView();
// sensorModel_1 = new SensorModel(...[some arguments]...);
// sensorControl_1 = new SensorControl(sensorModel_1);
// mainGrid.Children.Add(sensorControl_1);
}
您的MainView类:
public class MainView {
public SensorControl Control {get; internal set;}
...
}
并在您的xaml中更改绑定:
<Label Content="{Binding Control.Model.Title}"/>
感谢你们所有人,我接受了你们的建议,最后我找到了办法。
1)我在SensorModel
中实现了一个事件,每当任何属性发生更改时都会触发该事件(名称为ModelChanged
)
2)然后,当梅尔韦&manOvision二者的建议,我声明在一个依赖属性SensorControl
(类型SensorModel
)和绑定UI元素到( Binding Path=Model.Title
)
3)然后我在SensorControl
使用了此依赖项属性的ModelChanged
事件并引发了一个事件(类型为INotifyPropertyChanged),因此绑定更新了它们的值
它工作正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.