2017-08-15 10 views
-1

私はMVVM WPFアプリケーションで作業しており、これを解決しようとしています。 %)

私はモデルクラスDeviceModel App.xaml.csからインスタンス化しました。このモデルは、 INotifyPropertyChangedインターフェイスを実装しています。InitializeComponent()からインスタンス化された重複モデル

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

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


<Application.Resources> 
    <vm:ViewModelBase x:Key="ViewModelBaseApp"/> 
    <m:DeviceModel x:Key="DeviceModelApp"/> 
</Application.Resources> 

その後MainWindow.xamlから私はViewModelBaseをインスタンス化:

<Window.DataContext> 
     <Binding Source="{StaticResource ViewModelBaseApp}"/> 
    </Window.DataContext> 

その後、私はのボタンをバインドしますUI( Mai のICommandインタフェースを実装ViewModelBaseのコマンドにnWindow.xaml)は、:

Command="{Binding InputPhantomCommand, Converter={StaticResource InputPhantomConverter}, Source={StaticResource ViewModelBaseApp}}" 

これは素晴らしい作品!私はViewModelBaseでコマンドが呼び出され、今度は他のクラスに伝播イベントを、にPropertyChanged をトリガー( App.xaml.csでインスタンス)DeviceModelInstanceのプロパティを変更します、ボタンを押してくださいそのイベントを聞いている。すべてのICommandバインドされたボタンは、この方法で動作します。

私はスライダーデバイスモデルクラスのプロパティに、すなわち結合したときただし、:

Value="{Binding InputChannel2.Gain, Converter={StaticResource InputGainConverter}, Source={StaticResource DeviceModelApp}}" 

をスライダーのすべてがにバインドされますのInitializeComponent(でインスタンスを取得しますデバイスモデルクラスを、複製)コンストラクタのメソッド MainWindow.xaml.cs。いずれかのスライダを動かすと、重複したモデルは変更にうまく反応します。スライダと同じプロパティにバインドされているラベルはすべて動的に更新されます。ただし、すべてのイベントは、元のDeviceModelInstanceオブジェクト( App.xaml.cs)ののイベントで聴かれ、明らかにイベントは発生しません。

ボタンのすべては、私が App.xaml.csで作成DeviceModelInstanceと対話している理由のスライダーと、それに対応するラベルの全てがと対話している間、私は(デバイスモデルを複製し、把握することはできません)メインウィンドウのInitializeComponentの()で作成されます ...

私はそれがXAMLで正しく元DeviceModelInstanceを参照の問題だ疑いがあるが、私はこれを行う方法を知りません。ありがとうございました!)

+0

2つのDeviceModelインスタンスを意図的に作成します.1つはAppコンストラクタに、もう1つはApplication.Resourcesに作成します。 – Clemens

+0

しかし、App.xamlのを省略すると、以前作成したDeviceModelInstanceをMainWindow.xamlのStaticResourceとしてどのように使用できますか? – user141548

+0

App.xamlでDeviceModelプロパティを作成するのはなぜですか? – mm8

答えて

1

ので、ウィルとクレメンスのコメントで与えられた手がかりに加えて、何とかこの答えは、さらに私のためにそれをクリア - Multiple Instances of ViewModel

を具体的に、行:

それへのアクセスを取得するにはコードビハインドで、(AdminViewModel)this.DataContextを使用してAdminViewModelを取得します。私の場合は

、その後、XAMLを経由してViewModelBaseインスタンスをインスタンス化し、パブリックプロパティとして設定し、ViewModelBaseクラスにアプリケーションクラスからDeviceModelInstanceを移転した後:

<Window.DataContext> 
     <vm:ViewModelBase/> 
    </Window.DataContext> 

をそして最後に、この特定のViewModelBaseインスタンスを参照:

public partial class MainWindow : Window 
{ 
    public ViewModelBase vm; 

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

これは、ViewModelBaseの1つのインスタンス(およびそれに続くDeviceModelのインスタンス)がXAMを使用してインスタンス化されるためLであり、コードビハインドで参照されます。 しかし、私はまだ同じことを他の方法、つまりModelオブジェクトをコードでインスタンス化し、XAMLでのみ参照し、新しいインスタンスを作成しないという方法は理解できません。

ありがとうございます!

関連する問題