C# 从InitializeComponent()实例化的重复模型
我正在开发一个MVVM WPF应用程序,试图解决这个问题时遇到了死胡同。%)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
我有一个从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();
}