c# - View 不会随着 viewModel 的变化而更新

标签 c# wpf xaml mvvm user-controls

我有一个名为 SensorControl 的用户控件,我想将其 dataContext 绑定(bind)到名为 SensorModel 的 viewModel 类。 绑定(bind)成功并且 viewModel 的初始值 在 userControl 中可见,但问题是当我更改 viewModel 的属性时,userControl 不会更新,我必须手动更新它(通过将 null 分配给它的 dataContext 并再次分配 viewModel)。 这是我的代码的一个简化示例。

传感器控制.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;
    }
}

主窗口.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),并且多个 userControls 必须绑定(bind)到它(每个都使用模型的不同部分)。

2) 我不是 WPF 的新手,但我是 MVVM 的新手,我可能误解了一些重要的东西,所以如果有人能清楚地解释正确的方法,我将不胜感激。

提前致谢

最佳答案

在您的 UserControl 中,删除 DataContext 属性并添加一个 x:Name 属性。然后在您的标签中,像这样绑定(bind):

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

我认为问题是无法将 DataContext 设置为模型,因为绑定(bind)会脱离父级的 DataContext,当它作为子级添加到其中时,父级的 DataContext 将基于 mainGrid。由于 maiGrid 的 DataContext 中不存在属性“Model”,因此不会发生任何绑定(bind),因此您的更新不会反射(reflect)出来。正确获取 UserControl 的 DataContext 可能很棘手。我经常使用 ElementName 或在 UserControl 上创建 DependencyProperties,然后从将使用该控件的父级设置它们。

关于c# - View 不会随着 viewModel 的变化而更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023750/

相关文章:

c# - 如何使用 SevenZipSharp 将文件添加到存档

wpf - 如何确定我的 WPF(xbap) 应用程序是从哪个文件夹启动的?

wpf - 导入具有特定参数的类

wpf - 设置 ListView 以填充所有可用的垂直空间

wpf - 链接内容不适用于资源词典

xaml - UWP页面过渡动画

c# - 适合初学者的智能线程池

c# - 是否有任何已知的方法来更改命名空间但支持 API 中的旧方法

C# - 使用 foreach 遍历方法参数

c# - 标记在 XML 命名空间中不存在