视图不会随更改viewModel

时间:2016-06-25 00:15:50

标签: c# wpf xaml mvvm user-controls

我有一个名为SensorControl的userControl,我想将其dataContext绑定到名为SensorModel的viewModel类。 绑定成功,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)我在INotifyPropertyChanged

中实施了SensorModel

1)我需要这个的原因是,只有一个概念是传感器&#39;在我的项目中(它是一个真正的电子传感器),因此我有一个模型(处理真实传感器,数据库等),但在UI中我有多个userControls用于呈现传感器的不同方面。所以我必须为每个真实传感器创建一个模型实例(SensorModel),并且多个userControl必须绑定到它(每个都使用不同的模型部分)。

2)我对WPF并不陌生,但我是MVVM的新手,我可能会误解一些必要的东西,所以如果有人能清楚地解释一下,我会很感激。正确的做法。

提前致谢

3 个答案:

答案 0 :(得分:1)

在UserControl中,删除DataContext属性并添加x:Name属性。然后在你的Label中,像这样绑定:

<UserControl x:Name="uc">
    <Label Content="{Binding ElementName=uc,Path=Model.Title}" />
</UserControl>

我认为问题是DataContext无法设置为Model,因为绑定工作在父级的DataContext上,当它作为子节点添加到主格式时将基于mainGrid。由于物业&#34;模型&#34;在maiGrid的DataContext中不存在任何绑定都会发生,因此您的更新不会反映出来。正确获取UserControl的DataContext可能很棘手。我使用ElementName很多或在UserControl上创建DependencyProperties,然后从将使用该控件的父设置它们。

答案 1 :(得分:1)

您需要在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}"/>

答案 2 :(得分:1)

感谢你们所有人,我接受了你们的建议,最后我找到了办法。

1)我在SensorModel中实施了一个事件,每当任何属性发生变化时都会触发(名称ModelChanged

2)然后作为Merve&amp; manOvision建议,我在SensorControl(类型SensorModel)中声明了一个依赖属性,并将ui元素绑定到那个(Binding Path=Model.Title

3)然后我在ModelChanged中使用了此依赖项属性的SensorControl事件并引发了一个事件(类型为INotifyPropertyChanged),以便绑定更新它们的值

工作正常。