WPFウィンドウがあり、そのウィンドウにグリッドがあります。
M-V-VMモデルを使用し、コード(グリッド内のビューモデル)でグリッドにTextBoxを動的に追加したい
グリッドにアクセスするにはどうすればよいですか?
Supervisoring Controllerパターンを使用します。
読み取り:
CaliburnMicroMVVMフレームワークの実装例を以下に示します(他のすべてのフレームワークでも同じように動作します-MVVMを自分で行う場合は、手動で実行できます)。
http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view
例:
1)インターフェースIView
を定義します。ViewModel
(VM
)は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)View
のVM
プロパティを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)VM
call IView.AddTextboxToGrid()
_public class ViewModel
{
public IView View { get; set; }
public void AddTextBoxToGrid()
{
if (View == null) return;
View.AddTextBoxToGrid()
}
}
_
作成コードをViewに移動する必要があります。ViewModelは、呼び出されたときにビューに通知するだけです。
また、ビューのコードビハインドでビューのDataContext(ViewModel)を使用して、テキストボックスをグリッドに追加することもできます。それはより理にかなっています。
XAMLファイルでグリッドに名前を付けると、すぐにコードビハインドでグリッドにアクセスできます。