2011-04-12 229 views
6

下面是我的情況的非常快速和簡單的解釋。我已經定義了一個樣式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, 如何將命令設置到其邏輯樹內深處的組件?

感謝您的幫助!

回答

16
  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