Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从InitializeComponent()实例化的重复模型_C#_Wpf_Mvvm_Visual Studio 2017 - Fatal编程技术网

C# 从InitializeComponent()实例化的重复模型

C# 从InitializeComponent()实例化的重复模型,c#,wpf,mvvm,visual-studio-2017,C#,Wpf,Mvvm,Visual Studio 2017,我正在开发一个MVVM WPF应用程序,试图解决这个问题时遇到了死胡同。%) 我有一个从App.xaml.cs实例化的模型类DeviceModel。此模型实现INotifyPropertyChanged接口 public partial class App : Application { public DeviceModel DeviceModelInstance { get; set; } public App() { DeviceModelInsta

我正在开发一个MVVM WPF应用程序,试图解决这个问题时遇到了死胡同。%)

我有一个从App.xaml.cs实例化的模型类DeviceModel。此模型实现INotifyPropertyChanged接口

public partial class App : Application
{
    public DeviceModel DeviceModelInstance { get; set; }

    public App()
    {
        DeviceModelInstance = new DeviceModel();
    }
}

在App.xaml中:

这太棒了!我按下一个按钮,调用ViewModelBase中的一个命令并更改DeviceModelInstance(在App.xaml.cs中实例化)的一个属性,该属性反过来触发PropertyChanged事件,该事件传播到侦听该事件的其他类。UI中所有的ICommand绑定按钮都是这样工作的。

但是,当我将滑块绑定到DeviceModel类中的属性时,即:

    Value="{Binding InputChannel2.Gain, Converter={StaticResource InputGainConverter}, Source={StaticResource DeviceModelApp}}"
所有滑块都绑定到一个重复的DeviceModel类,该类在MainWindow.xaml.cs的构造函数中的InitializeComponent()方法处实例化。当我移动任何滑块时,复制模型对更改的反应良好。绑定到与滑块相同属性的所有标签都会动态更新。然而,所有事件都在原始DeviceModelInstance对象(来自App.xaml.cs)上侦听,显然没有发生任何事件

我无法理解为什么所有按钮都与我在App.xaml.cs中创建的DeviceModelInstance交互,而所有滑块及其相应标签都与在MainWindow的InitializeComponent()处创建的重复DeviceModel()交互


我怀疑这是在XAML中正确引用原始DeviceModelInstance的问题,但我不知道如何做到这一点。谢谢

所以,除了威尔和克莱门斯在评论中给出的线索外,不知何故,这个答案让我更清楚了-

具体而言,该行:

要在代码隐藏中访问它,请使用(AdminViewModel)this.DataContext获取您的AdminViewModel

在我的例子中,将DeviceModelInstance从App类重新定位到ViewModelBase类后,将其设置为公共属性,然后通过XAML实例化ViewModelBase实例:

    <Window.DataContext>
         <vm:ViewModelBase/>
    </Window.DataContext>
这对我来说是可行的,因为只有一个ViewModelBase实例(随后只有一个DeviceModel实例)通过XAML实例化,并在代码隐藏中引用。 然而,我仍然不明白如何以另一种方式来做同样的事情,即在代码中实例化模型对象,只在XAML中引用它们,而不创建它们的新实例


谢谢

您有意创建两个DeviceModel实例,一个在App构造函数中,另一个在Application.Resources中,我如何在MainWindow.xaml中将先前创建的DeviceModelInstance用作StaticResource?为什么要在App.xaml中创建DeviceModel属性?出于某种奇怪的原因,您使其变得非常复杂。扔掉你的资源。有一个根视图模型,其中包含一个公共属性和DeviceModel。将DataContext设置为codebehind中的根视图模型。“如果我不在XAML中定义它,我就无法将任何元素绑定到该模型。”这不是真的。将DataContext设置为具有ViewModelBase和DeviceModel属性的顶级视图模型。
    Command="{Binding InputPhantomCommand, Converter={StaticResource InputPhantomConverter}, Source={StaticResource ViewModelBaseApp}}"
    Value="{Binding InputChannel2.Gain, Converter={StaticResource InputGainConverter}, Source={StaticResource DeviceModelApp}}"
    <Window.DataContext>
         <vm:ViewModelBase/>
    </Window.DataContext>
public partial class MainWindow : Window
{
    public ViewModelBase vm;

    public MainWindow()
    {
        vm = (ViewModelBase)this.DataContext;
        InitializeComponent();
    }