2008-10-08 41 views

回答

2

我同意Joel的首選方法是通過觸發器或通過將Enabled值綁定到另一個依賴項屬性(可能在父元素上)來觸發設置按鈕的Enabled屬性和xaml標記, ValueConverter的幫助。但是,如果必須在C#中明確執行此操作,則可以在按鈕的模板屬性上使用FindName()方法。有一個MSDN'如何'linked here

3

你真的不應該明確這麼做,而應該在ControlTemplate本身中設置觸發器。這些觸發器會對其他更改作出反應,並將設置ButtonEnabled屬性。

4

我建議按鈕很容易通過RoutedUICommands進行控制 - 包括輕鬆啓用和禁用它們。命令不需要對Button的任何類型的引用,所以這也解決了你的問題。

在這裏看到:

<Window.CommandBindings> 
    <CommandBinding 
     Command="{x:Static local:MyCommands.MyCommand}" 
     Executed="CommandBinding_Executed" 
     CanExecute="CommandBinding_CanExecute" /> 
</Window.CommandBindings> 

<Window.Resources> 
    <ControlTemplate x:Key="MyTemplate" TargetType="Label"> 
     <Button Command="{x:Static local:MyCommands.MyCommand}"> 
      <TextBlock> 
       Click Me 
       <TextBlock Text="{TemplateBinding Content}" /> 
      </TextBlock> 
     </Button> 
    </ControlTemplate> 
</Window.Resources> 

<StackPanel> 
    <Label Template="{StaticResource MyTemplate}">1</Label> 
    <Label Template="{StaticResource MyTemplate}">2</Label> 
    <Label Template="{StaticResource MyTemplate}">3</Label> 
    <Label Template="{StaticResource MyTemplate}">4</Label> 
    <Label Template="{StaticResource MyTemplate}">5</Label> 
</StackPanel> 

使用此:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void CommandBinding_CanExecute(object sender, System.Windows.Input.CanExecuteRoutedEventArgs e) 
    { 
     // your logic here 
     int _Integer = -1; 
     int.TryParse(e.Parameter.ToString(), out _Integer); 
     e.CanExecute = _Integer % 2 == 0; 
    } 

    private void CommandBinding_Executed(object sender, System.Windows.Input.ExecutedRoutedEventArgs e) 
    { 
     // do something when clicked 
    } 
} 

public static class MyCommands 
{ 
    public static RoutedUICommand MyCommand = new RoutedUICommand(); 
} 

的樣子:

screenshot

0

我有一個問題,在CONTROLTEMPLATES &的DataTemplates按鈕。我發現觸發器通常太麻煩,無法準確提供我的客戶想要的東西,最後我得到了太多的轉換器。我第一次嘗試的方法是定義這些更難的模板內聯,以便他們可以綁定到我的屏幕ViewModel上的命令(&代碼隱藏事件)。

如果你是模板化自己的控制,我要提到的最簡單的方法是簡單地命名按鈕,然後用這樣的:

hourHand = this.Template.FindName("PART_HourHand", this) as Rectangle; 

然而,最近我已經改變了圓通(回indevidual文件..重新使用!),但開始添加一個ViewModel(各種),我後綴...TemplateCommandStore到所有我的模板有點複雜。我甚至模板化時,我customcontrols(一致性,大部分)使用這個

public class BookingDetailsTemplateCommandStore 
{ 
    public OpenWindowCommand_Command OpenWindowCommand_Command { get; set; } 

    public BookingDetailsTemplateCommandStore() 
    { 
     OpenWindowCommand_Command = new OpenWindowCommand_Command(this); 
    }  
} 

然後我就可以開心地在模板中使用此命令。您還可以通過綁定(依賴性?)屬性來將控件引用傳遞到命令存儲區,以捕獲事件&可以更精確地控制模板。

<DataTemplate DataType="{x:Type LeisureServices:BookingSummary}"> 
    <Border Height="50" otherStyling="xyz"> 
     <Border.Resources> 
      <local:BookingDetailsTemplateCommandStore x:Key="CommandStore" /> 
     </Border.Resources> 
     <DockPanel> 
      <Button otherStyling="xyz" 
        Command="{Binding Source={StaticResource CommandStore}, 
             Path=OpenWindowCommand_Command}" /> 

MVVM:我發現,只要圖形化的邏輯就是這樣,從業務邏輯完全不同,這種方法不會干擾MVVM。實質上,我爲模板添加了一致的C#代碼能力,任何花費太多時間在winform上的人都可能會像我一樣錯過。

相關問題