2011-10-24 7 views
1

私はViewModelにバインドしたい単純なビューを持っています。私は現在、データバインディングにSource =形式を使用していますが、コード内のDataContextを指定するために変換したいと考えています。コード内にDataContextを指定

これは私が持っているものであり、それは働いている...

XAML:

<Window.Resources> 
     <local:ViewModel x:Key="ViewModel" /> 
    </Window.Resources> 

    <Button Content="Click"> 
     <local:EventToCommand.Collection> 
      <local:EventToCommandCollection> 
       <local:EventToCommand Event="Click" Command="{Binding Source={StaticResource ViewModel}, Path=ClickCommand, diag:PresentationTraceSources.TraceLevel=High}" /> 
       <local:EventToCommand Event="GotFocus" Command="{Binding Source={StaticResource ViewModel}, Path=GotFocusCommand}" /> 
      </local:EventToCommandCollection> 
     </local:EventToCommand.Collection> 
    </Button> 
</Window> 

のViewModelコード:

public class ViewModel 
{ 
    public Command ClickCommand { get; set; } 
    public Command GotFocusCommand { get; set; } 

    public ViewModel() 
    { 
     ClickCommand = new Command((obj) => { Execute(obj); return null; }); 
     GotFocusCommand = new Command((obj) => { Execute(obj); return null; }); 
    } 

    void Execute(object param) 
    { 
     if (param != null) 
      System.Windows.MessageBox.Show(param.ToString()); 
     else 
      System.Windows.MessageBox.Show("Execute"); 
    } 
} 

今、私がやりたいすべては私の窓の中でこれですコードの後ろ:

public MainWindow() 
{ 
    InitializeComponent(); 

    DataContext = new ViewModel(); 
} 

を削除し、XAMLのWindow.Resourcesセクションを削除しますが、バインディング文字列をどのように変更する必要があるかはわかりません。

+0

あなたは「あなたがわからない」とはどういう意味ですか?あなたはXAMLコードにアクセスできませんか? XAMLで使用したすべてのバインディングエフェクトから 'Source = {StaticResource ViewModel}'セクションを削除することができますか?これを行うと、データは 'DataContext'自体から取得されます。 –

+0

下記の私のコメントを参照してください... – Oliver

+0

@Olivger、http://adammills.wordpress.com/2011/02/14/eventtocommand-action-mvvm-glue/によると、@レイチェルはうまくいくはずです。あなたのビジュアルスタジオの 'Output'ウィンドウを見て、バインディングエラーがあるかどうかを確認してください ... –

答えて

2

DataContextはデフォルトSourceあるので、これは動作するはずです:

<local:EventToCommand Event="GotFocus" Command="{Binding GotFocusCommand}" /> 
+0

これは親要素のDataContextを使用します。この場合はボタンです。どちらがうまくいくのでしょうか。しかし、UserControlsのようないくつかの要素は、親ビジュアルからDataContextを継承しないため、手動で設定する必要があります。 –

+0

My EventToCommandCollectionはEventToCommandCollection:List として定義されており、WindowからのDataContextの伝播が停止して指定されたエントリに決して到達しないようです。提案通りの文字列を変更することはできません。なぜDataContextはそこで停止しますか? – Oliver

+0

@ClausJørgensen、あなたは真剣に間違います。 'DataContext'は、その要素がビジュアルツリーに属していれば、それがユーザコントロールかどんなものであっても、常に継承されます。データコンテキストを継承しないものは、ContextMenus、Popups、DataGridColumnsです。データコンテキストを継承するには、それらをビジュアルツリーに手動で「アタッチ」する必要があります。 –

関連する問題