繁体   English   中英

View不会随着viewModel的更改而更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM