2012-04-09 3 views
1

У меня есть DataTemplate, которые положили в ResourceDictionary, и есть кнопка в DataTemplate, и я положил это DataTemplate в окно. Теперь я хочу привязать Button Command к свойству 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

Короткий ответ в том, что вам не нужно делать это в код.

Вы определили свой DataTemplate как шаблон для объекта «Пользователь». Это означает, что таким образом пользовательский объект должен отображаться в пользовательском интерфейсе. Итак, для использования вашего DataTemplate у вас должен быть экземпляр «Пользователь» в вашем WindowViewModel. Это означает, что SelectLocationCommand должен находиться в объекте User, а не в WindowViewModel.

Сказав все это, ваш код должен выглядеть Somthing так:

В 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"; 
} 

Кроме того, убедитесь, что DataContext Window.xaml является WindowViewModel. Там в ряд лучших способов сделать это, но проще всего было бы:

В Window.xaml.cs

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

спасибо Alex, но я не хочу, чтобы положить SelectLocationCommand в классе User !! на самом деле пользователь класс сущности! –

+0

Есть решения, чтобы иметь команду в родительском ViewModel, если бы вы могли просто дать несколько подробностей о вашем дизайне, я мог бы помочь вам лучше. Когда вы говорите, что Пользователь на самом деле является классом Entity, вы имеете в виду, что это модель? – AlexDrenea

+0

спасибо alex, у него действительно простое решение, вам просто нужно установить имя для окна и в bindTemplate dataTemplate. Указывает имя элемента в это имя. –

Смежные вопросы