2017-11-13 1 views
1

標準のMessageBoxを置き換えるカスタムmessageBoxウィンドウを作成しました。ビューモデルからウィンドウを取得する

私のカスタムメッセージボックス(子ウィンドウ)は、引数として渡される親ウィンドウを必要とします。親ウインドウは、子ウインドウが指定された位置(Top Left、Top Centerなど)内に引数としても配置される場所です。

ビューモデルからカスタムのmessageBoxを呼び出すときに、ウィンドウを通過させる必要があります。ビューモデルにウィンドウを関連付けるにはどうしたらいいですか?

おそらく、コメントhereのようなインターフェイスを使用していますか?私はそれを実装しようとしていますが、this.DataContext.Viewは存在しません。私は、Visual Studioを使用してい

試行#1:私はコードビハインドコンストラクタからでXAMLからのDataContextを初期化していないソリューション

<Window x:Class="MyNamespace.Main" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:viewmodel="clr-namespace:MyNamespace.ViewModels"> 
    <Window.Resources> 
     <viewmodel:MainViewModel x:Key="wMainViewModel" /> 
    </Window.Resources> 

    <Grid DataContext="{StaticResource wMainViewModel}"> 
    </Grid> 
</Window> 

を考慮しMM8、どのようにすることができますビューモデルをビューに渡しますか?

+3

をメッセージボックスを処理するコードではありませんMVVMの*その他の部分? (のように、あなたのモデルではビジネスを持っていません) –

+1

ViewModelに渡すか、 'Application.Current.MainWindow'を使います。しかし、ティモシー氏によると、あなたのViewModelはWindowsについて知りません。 –

+0

[MVVMでメッセージボックスを表示する方法](https://stackoverflow.com/questions/3705991/how-to-show-messagebox-in-mvvm)の可能な複製 – Sinatr

答えて

2

どのようにウィンドウをビューモデルに関連付けることができますか?

あなたは、ウィンドウを実装インタフェースとビューモデルを注入できます。

public interface IView 
{ 
    double Top { get; } 
    double Left { get; } 
    double Height { get; } 
    double Width { get; } 
} 

public partial class MainWindow : Window, IView 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel(this); 
    } 
} 

public class ViewModel 
{ 
    private readonly IView _view; 

    public ViewModel(IView view) 
    { 
     _view = view; 
    } 

    //... 
} 

を次にビューモデルは(多分IViewの以外の何かと呼ばれるべきである)インターフェイスを知っています。

あなたが醜いと非MVVMフレンドリーショートカットをしたい場合は、あなたがApplicationクラス使用することができますすべてのものを作成するために

var win = Application.Current.MainWindow; 

ファクトリクラスを:

public MainWindow WindowFactory() 
{ 
    MainWindow mainWindow = new MainWindow(); 
    ViewModel viewModel = new ViewModel(); 
    mainWindow.DataContext = viewModel; 

    return mainWindow; 
} 
+0

私の更新を参照してください(試行#1)。私はコードビハインドではなく、xamlからdatacontextを初期化します。この場合、どのようにビューを渡すことができますか? – user1624552

+2

できません。 XAMLでビューモデルを作成することは悪い考えです。特にこの場合は注意が必要です。代わりにコードビハインドで作成します。 – mm8

+0

Ok、あなたが言ったように、私は投稿したコードビハインドでxamlでdatacontextを初期化できますか? – user1624552

関連する問題