2012-04-09 71 views
1

我有一个DataTemplate已投入ResourceDictionary,并在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

简短的回答是,你不需要做这件事码。

您将DataTemplate定义为“用户”对象的模板。这意味着这是用户界面中应如何显示用户对象。所以,为了使用你的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(); 
} 
+0

感谢亚历克斯,但我不想把SelectLocationCommand在用户级!其实用户实体类! – 2012-04-10 04:17:41

+0

有一些解决方案可以在父视图模型中使用该命令,如果您只是提供一些关于您的设计的更多细节,我可能会更好地帮助您。当你说用户实际上是实体类时,你的意思是这是模型吗? – AlexDrenea 2012-04-10 16:06:55

+0

感谢alex,它有一个真正简单的解决方案,您只需要为窗口设置一个名称,并在dataTemplate bindig中指定该名称的元素名称。 – 2012-04-11 04:31:15

相关问题