2014-11-01 180 views
0

結合我有一個自定義Button如下:WPF命令自定義用戶控件

<UserControl...> 
    <Button HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="3*"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 

      <Viewbox Stretch="Uniform" Grid.Column="0"> 
       <TextBlock x:Name="numCopyTB" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Text}"/> 
      </Viewbox> 
      <Viewbox Grid.Column="1"> 
       <TextBlock Style="{StaticResource updownBlock}"/> 
      </Viewbox> 

     </Grid> 
    </Button> 
</UserControl> 
在其代碼

後面,我添加了Text屬性。後面的代碼低於:

public partial class UpdownButton : UserControl 
{ 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(UpdownButton)); 

    public UpdownButton() 
    { 
     InitializeComponent(); 
    } 

    public string Text 
    { 
     get { return GetValue(TextProperty) as string; } 
     set { SetValue(TextProperty, value); } 
    } 
} 

我正在學習有關CommandBinding,並希望能夠像做<local:MyCustomButton Command="{Binding MethodName}"/>

看來我需要在codebehind中添加一個Command屬性,但Type應該是Command是什麼?我做了一些搜索,似乎有很多的可能性:RoutedUICommandRoutedCommand,CommandBinding,DelegateCommand等,我很迷茫。任何幫助表示讚賞!

回答

1

任何綁定到命令DependencyProperty的對象都必須實現ICommand interface。我的建議是,如果你所要做的只是使用一個命令來捕捉和處理按鈕的點擊輸入,那就是使用RelayCommand設計的實現。這將允許您在您的視圖模型創建RelayCommand的一個實例:

public RelayCommand yourCustomButtonCommand { get; set; } 

而且在構造函數,實例化RelayCommand像這樣:

MyCommand = new RelayCommand( 
ExecuteMyCommand, 
() => _canExecuteMyCommand); 

其中ExecuteMyCommand要執行你希望的方法每次單擊按鈕時,_canExecuteMyCommand是一個謂詞,用於確定按鈕在任何給定時間點是否應該是可點擊的。

根據您的問題,這裏的如何,你可以從按鍵在您的代碼隱藏繼承:

public partial class UpdownButton : Button 
{ 
    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(UpdownButton)); 

    public UpdownButton() 
    { 
     InitializeComponent(); 
    } 

    public string Text 
    { 
     get { return GetValue(TextProperty) as string; } 
     set { SetValue(TextProperty, value); } 
    } 
} 

這將產生從按鍵繼承所有依賴性質,以及具有你所定義的新對象以上。最重要的是要記住用戶控件中用於XAML的頂級類型必須更改爲<Button>,而不是<UserControl>

通過這些更改,您的UpdownButton現在將具有Command屬性以及Button的每個其他屬性。

+1

感謝您的回覆。如果我要使用'RelayCommand',我仍然需要做一些類似''來將命令「綁定」到按鈕,對吧?問題是目前'MyCustomButton'沒有'Command'屬性(不會在intellisense中顯示)。那麼爲了使用'RelayCommand',有必要實現'ICommand'接口嗎? – totoro 2014-11-01 05:58:52

+0

@green Hm - 你是否繼承自定義按鈕中的按鈕?我的理解是,從繼承控件繼承所有的依賴屬性。 – furkle 2014-11-01 06:00:11

+1

@green Hm,這可能對我來說是無知的,但是如果你正在努力做出幾乎像Button一樣的東西,但有點不同,爲什麼不從Button繼承呢? – furkle 2014-11-01 06:10:18