2010-05-14 32 views
1

我將開始說,我沒有使用我的WPF應用程序的MVVM模式。請原諒我。WPF中的一個選擇性雙重命令綁定轉換器?

現在我有一個數據模板,帶有兩個按鈕,每個數據模板綁定到此數據模板表示的CLR對象上的不同命令。兩者都使用相同的命令參數。這是一個按鈕的例子。

<Button x:Name="Button1" 
     Command="{Binding Path=Command1}" 
     CommandParameter="{Binding Path=Text, ElementName=TextBox1}" 
/> 
<Button x:Name="Button2" 
     Command="{Binding Path=Command2}" 
     CommandParameter="{Binding Path=Text, ElementName=TextBox1}" 
/> 

我想重構爲一個單一的按鈕,可以基於用戶設置等在Settings.settings一個布爾執行任一命令此。我無權訪問重構CLR對象本身。此外,這是一個數據模板,沒有代碼隱藏給我使用。我的看法是轉換器是最好的選擇,但我不知道如何將它們放在一起。

轉換器需要接受CommandParameter以及DataContext,以便知道執行命令的對象。

有人可以借我一把嗎?提前致謝。

回答

4

快速和骯髒的解決方案 - 將兩個按鈕放在窗體上,並將它們的可見性綁定到bool的值(顯然是否定的) - 這樣只會顯示有效按鈕。

如果你確實想使用轉換器,我會傾向於在命令綁定中使用它,傳遞CLR對象和bool的值,並允許它返回正確的命令綁定到。我看不到任何理由傳入命令參數,因爲這將是相同的任何方式。

XAML:

<Resources> 
    <controls:CommandConverter x:Key="CommandConverter"/> 
</Resources> 

<Button x:Name="Button" 
     CommandParameter="{Binding Path=Text, ElementName=TextBox1}"> 
    <Button.Command> 
     <MultiBinding Converter="{StaticResource CommandConverter}"> 
      <MultiBinding.Bindings> 
      <Binding /><-- the datacontext CLR object --> 
      <Binding ... /><-- Application setting (however you intend to get that in) 
      </MultiBinding.Bindings> 
     </MultiBinding> 
    </Button.Command> 
</Button> 

代碼:

public class CommandConverter : IMultiValueConverter 
{   
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     CommandObject clrObject= (CommandObject)values[0]; 
     bool setting = (bool)values[1]; 

     if (setting) 
     { 
      return clrObject.Command1; 
     } 

     return clrObject.Command2; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

其實如果設置布爾只是在應用程序設置你可以只是直接在轉換器和唯一的使用方式,因此一個正常的單值轉換器。不是很棒的設計,因爲它應該是獨立的,但會完成工作。

+0

當然! 我只是失敗了WPF 101。 – Jippers 2010-05-14 17:11:54