web-dev-qa-db-ja.com

viewmodelのmvvmモデルのコントロールにアクセスするにはどうすればよいですか?

WPFウィンドウがあり、そのウィンドウにグリッドがあります。

M-V-VMモデルを使用し、コード(グリッド内のビューモデル)でグリッドにTextBoxを動的に追加したい

グリッドにアクセスするにはどうすればよいですか?

32
Sanjay Patel

Supervisoring Controllerパターンを使用します。

読み取り:

CaliburnMicroMVVMフレームワークの実装例を以下に示します(他のすべてのフレームワークでも同じように動作します-MVVMを自分で行う場合は、手動で実行できます)。

http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view

例:

1)インターフェースIViewを定義します。ViewModelVM)はView必要なメソッド

_public interface IView 
{
    void AddTextBoxToGrid();
}
_

2)ViewからIViewの背後にあるコードを継承し、IView.AddTextboxToGrid()メソッドを実装します

_public partial class View: IView 
{
    public void AddTextBoxToGrid() 
    {  
        // implement here your custom view logic using standard code behind; 
    }
}
_

3)タイプIViewのプロパティをVMに追加します

_public class ViewModel 
{
    public IView View { get; set; }
}
_

4)ViewVMプロパティをViewのインスタンスにIView例コードビハインド:

_ DataContext.View = this as IView; 
_

またはCaliburnでは、IScreen.OnViewAttachedオーバーライドメソッドを使用できます)

_public partial class View: IView 
{
    public View()
    {
        // access you VM by the strategy of your framework or choice - this example is when you store your VM in View's DataContext
        (DataContext as ViewModel).View = this as IView;
    } 

    public void AddTextBoxToGrid() 
    {  
        // implement here your custom view logic using standard code behind; 
    }
}
_

5)VMcall IView.AddTextboxToGrid()

_public class ViewModel 
{
    public IView View { get; set; }

    public void AddTextBoxToGrid() 
    {
        if (View == null) return;
        View.AddTextBoxToGrid()
    }
}
_
69
nihique

作成コードをViewに移動する必要があります。ViewModelは、呼び出されたときにビューに通知するだけです。

3
Lonli-Lokli

また、ビューのコードビハインドでビューのDataContext(ViewModel)を使用して、テキストボックスをグリッドに追加することもできます。それはより理にかなっています。

XAMLファイルでグリッドに名前を付けると、すぐにコードビハインドでグリッドにアクセスできます。

1
Geerten