如何将DataTemplate中的按钮绑定到ViewModel?

时间:2012-04-09 12:56:59

标签: wpf binding mvvm prism mvvm-light

我有一个DataTemplate已放入ResourceDictionaryDataTemplate中有一个按钮,我将此DataTemplate放在一个窗口中。现在我想将Button命令绑定到windowViewModel的属性,我该怎么做? 这是代码:

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

1 个答案:

答案 0 :(得分:2)

简短的回答是你不需要在代码中这样做。

您将DataTemplate定义为“用户”对象的模板。这意味着这就是用户对象应该在UI中显示的方式。因此,为了使用您的DataTemplate,您应该在WindowViewModel中有一个“User”实例。这意味着SelectLocationCommand应位于User对象中,而不应位于WindowViewModel中。

说了这么多,你的代码看起来应该是这样的:

在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();
}