WPF:在样式和/或数据模板(MVVM)中绑定命令?

WPF:在样式和/或数据模板(MVVM)中绑定命令?

问题描述:

下面是我的情况的非常快速和简单的解释。我已经定义了一个样式Hyperlink控制和他们有Command属性绑定到一个ViewModel类(简体)中定义的命令:WPF:在样式和/或数据模板(MVVM)中绑定命令?

<Window.Resources> 
    ... 
    <Style x:Key="hyperlinkStyle" TargetType="Hyperlink"> 
    ... 
    <Setter Property="Command" Value="{Binding Path=OpenHyperlinkCommand}" /> 
    ... 
    </Style> 
    ... 
</Window.Resources> 

接下来,我创建了我设计的窗口内容的控制。它有一个定义的数据模板,写在窗口资源中。在该数据模板中,我添加了一些超链接,并将这些超链接设置为使用之前定义的样式。

窗口看起来像这样(简化):

<Window> 
    ... 
    <ContentControl 
     ... 
     ContentTemplate="{StaticResource myDataTemplate}" /> 
    ... 
</Window> 

数据模板看起来像这样(简化):

<Window.Resources> 
    ... 
    <DataTemplate x:Key="myDataTemplate DataType="{x:Type my:MyType}"> 
    ... 
    <TextBlock> 
     <Hyperlink 
      Style="{StaticResource hyperlinkStyle}" 
      CommandParameter="{Binding Path=Uri1}"> 
     <TextBlock Text="{Binding Path=Uri1}" /> 
     </Hyperlink> 
    </TextBlock> 
    ... 
    <TextBlock> 
     <Hyperlink 
      Style="{StaticResource hyperlinkStyle}" 
      CommandParameter="{Binding Path=Uri2}"> 
     <TextBlock Text="{Binding Path=Uri2}" /> 
     </Hyperlink> 
    </TextBlock> 
    ... 
    </DataTemplate> 
    ... 
</Window.Resources> 

的风格,因为不工作的OpenHyperlinkCommand结合绑定到它的窗口的ViewModel包含此命令,但DataTemplate绑定到MyType对象,该对象不包含此命令(也不应该)。

我应该如何使这个绑定工作?两个问题:

  1. 这里是我的建议:我叫我的窗口x:Name="myWindow",并改变了命令的 结合的样式里面这样的:

    <Setter Property="Command" Value="{Binding ElementName=myWindow Path=DataContext.OpenHyperlinkCommand}" /> 
    

    这工作,但它看起来那么脏。我做错了吗?有没有更好的方法,更多 MVVM-like?这是脆弱的,因为我在一个样式中设置了特定的元素名称!

  2. 在第一个 的地方写一个风格的命令绑定是一个好习惯吗?如果不是,还有什么选择?如果我开发了一个复杂的UserControl, 如何将命令设置到其逻辑树内深处的组件?

感谢您的帮助!

  1. 一个可选的语法将使用的RelativeSource

    <Setter Property="Command" Value="{Binding DataContext.OpenHyperlinkCommand, RelativeSource={Relative Source AncestorType={x:Type Window}}}">

  2. 我看不出什么错写命令绑定的风格

+0

这只是让我很快乐.. 。 谢谢! – danjarvis 2011-05-20 15:57:20