2010-02-23 59 views
2

的結果我有一個自定義的SplitButton實現,其中包含綁定於命令的幾個ComboBoxItems一個ComboBox。我可以綁定到名稱,和該命令就好的Text屬性,但沒有的ComboBoxItem的的IsEnabled屬性綁定到一個命令的CanExecute方法的結果,因爲它是一種方法的方法。是否有一些我不知道綁定到方法的語法,還是有一些技巧會幫助我綁定到CanExecute。如何將ComboBoxItem的IsEnabled屬性綁定到命令的CanExecute方法

順便說一句,我想過使用自定義的ValueConverter,除了我意識到我可能不會收到任何更新時CanExecute重新評估,因爲它不是一個屬性,因爲我的命令不是業務對象。在我看來,我可能不得不爲這個命令創建一個ViewModel,只能在我自定義的SplitButton控件中使用,但對我來說似乎有點過分。

回答

1

通過視圖模型另一種解決方案。以下是我如何使用ViewModel解決我的問題。請注意,這個漂亮的NotifyPropertyChanged方法是我的基本ViewModel類的一部分。

public class RoutedUICommandViewModel : ViewModel 
{ 
    private RoutedUICommand _command; 
    private IInputElement _target; 

    public string Name { get { return _command.Name; } } 

    public string Text { get { return _command.Text; } } 

    public bool CanExecute 
    { 
     get 
     { 
      return _command.CanExecute(null, _target); 
     } 
    } 

    public RoutedUICommand Command { get { return _command; } } 

    public RoutedUICommandViewModel(ReportCommand command, IInputElement target) 
    { 
     _command = command; 
     _target = target; 
     _command.CanExecuteChanged += _command_CanExecuteChanged; 
    } 

    private void _command_CanExecuteChanged(object sender, EventArgs e) 
    { 
     base.NotifyPropertyChanged(() => this.CanExecute); 
    } 
} 
+0

我只接受這個答案,因爲它現在是我決定用在我的案例中。其他解決方案是可以接受的,我也打算爲這些其他解決方案進行投票。 – jpierson 2010-04-08 17:48:59

1

你可以把一個按鈕(如果你沒有一個在綁定到ICommand設置控件模板)內ItemContainerStyle(ComboBoxItem風格)和綁定命令將其 並添加一個觸發檢查Button.IsEnabled並設置值到ComboBoxItem。所以在這裏我們使用Button作爲CommandSource來從CanExeute獲取IsEnabled。您可以將按鈕的高度和寬度設置爲零

<ControlTemplate....> 
    <Grid ... 
     <Button x:Name="dummyButton" Command="{Binding YourCommand}" .... 
      ...... 
    </Grid> 

    <ControlTemplate.Triggers> 
     <Trigger SourceName="dummyButton" Property="IsEnabled" Value="False"> 
     <Setter Property="IsEnabled" Value="False"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
+0

整齊,我想這下掛羊頭賣狗肉類別肯定下降,但我喜歡它。如果沒有人提出更優雅的東西,我會使用它。 – jpierson 2010-02-23 18:33:01

+1

是的,當然這是棘手的,因此也是你的要求。做正確的方法是添加布爾視圖模型屬性,如果你想要做一個ICommand.CanExecute到DependancyProperty結合,這是我能看到 – 2010-02-23 19:29:02

+0

我同意最好的辦法,我認爲我的意見可能有錯誤的方式脫落。最後,我無法真正使用虛擬Button概念,因爲我聲明瞭我的ComboBoxItems並需要一個按鈕。無處可放我的虛擬按鈕,我選擇了不同的解決方案。 – jpierson 2010-02-23 21:04:50

1

我發現this discussion在哪裏Dr. WPF曾建議使用attached behavior來解決這個確切的問題MSDN論壇。他給出瞭如何使用它的例子。

<Grid behaviors:CommandBehaviors.EnablingCommand="{x:Static commands:testcommand.test}"> 
    . . . 
</Grid> 

雖然這種解決方案看起來相當不錯我一直無法投入時間去了解這是怎樣類型的行爲將被執行,什麼是參與。如果有人想詳細說明,請不要做其他事情,如果我有機會探索這個選項,我會更詳細地修改這個答案。

0

我解決我的代碼這個問題的方法是在組合框的PreviewMouseDown事件添加事件處理程序。這裏的處理程序:

private void comboBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      ViewModel vm = this.DataContext as ViewModel; 

      if (vm != null) 
      { 
       if (!vm.CanChangeSelection()) 
       { 
        e.Handled = true; 
        vm.RespondToFailedAttemptChangeUnits(); 
       } 
      } 
     } 

這對我來說很好,我只需要在一個位置執行此操作。如果我有很多這樣的網頁,它可能會變得有點麻煩。

而且,雖然我跟隨MVVM模式,我不是一個純粹的 - 我認爲這是遵循MVVM的精神很好的實用的解決方案,如果不信。

相關問題