2012-04-09 17 views
1

私はResourceDictionaryに入れたDataTemplateを持っていて、DataTemplateにボタンがあり、このDataTemplateをウィンドウに入れました。今私はwindowViewModelのプロパティにボタンコマンドをバインドしたい、私はそれを行うことはできますか? これはコードです:DataTemplateのボタンをViewModelにバインドする方法は?

<DataTemplate DataType="{x:Type types:User}" x:Key="UserTemp"> 
    <Grid > 
     <Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ????}, AncestorLevel=1}, Path=SelectLocationCommand}" /> 
    </Grid> 
</DataTemplate> 

とWindow.xaml

<ContentControl x:Name="UserTemp" /> 

とWindowViewModel中で:

public ICommand SelectLocationCommand 
    { 
     get {return new RelayCommand(selectLocationCommand); } 
    } 
    void selectLocationCommand() 
    { 
     _welcomeTitle = "AA"; 
    } 

答えて

2

短い答えは、あなたがそれを行う必要はありませんということですコード。

"User"オブジェクトのテンプレートとしてDataTemplateを定義しました。これは、UserオブジェクトをUIに表示する方法であることを意味します。したがって、DataTemplateを使用するには、WindowViewModelに「User」インスタンスが必要です。これは、SelectLocationCommandがWindowViewModelではなくUserオブジェクトになければならないことを意味します。

すべては、あなたのコードが見えるはずです気にいらこのように言った:

Window.xamlで

<ContentControl Content="{Binding User}" ContentTemplate="{StaticResource UserTemp}" /> 

WindowViewModel

public User User {get;set} 

でユーザーに

public ICommand SelectLocationCommand 
{ 
    get {return new RelayCommand(selectLocationCommand); } 
} 
void selectLocationCommand() 
{ 
    _welcomeTitle = "AA"; 
} 

また、Window.xamlのDataContextがWindowViewModelであることを確認してください。そこにこれを行うには良い方法の数が、最も簡単になります。Window.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new WindowViewModel(); 
} 
+0

おかげでアレックスに

が、しかし、私は、ユーザークラスにSelectLocationCommandを入れたいいけない!!実際にユーザーがありますエンティティクラス! –

+0

親ViewModelでこのコマンドを実行するソリューションがありますが、あなたのデザインに関する詳細をいくつか教えていただければ助かります。 Userが実際にEntityクラスであると言うと、それはモデルですか? – AlexDrenea

+0

ありがとうalex、それは本当に簡単なソリューションを持っています。ウィンドウの名前とdataTemplateのbindigを設定するだけで、その名前にelementnameを指定します。 –

関連する問題