2013-02-14 45 views
0

我有一个自定义的控制,它看起来像这样(简化的)一个ControlTemplate订阅DataTemplate中控件事件的最佳做法?

<ControlTemplate TargetType="CustomControl"> 
    <Grid> 
     <Grid.Resources> 
      <DataTemplate TargetType="CustomClassA"> 
       <TextBlock Text={Binding ClassASpecificProperty}" /> 
      </DataTemplate> 

      <DataTemplate TargetType="CustomClassB"> 
       <TextBlock Text={Binding ClassBSpecificProperty}" /> 
      </DataTemplate> 
     </Grid.Resources> 

     <ContentControl Content="{TemplateBinding Content}" /> 
    </Grid> 
</ControlTemplate> 

这样做的好处是,该特定Content,取决于它的类型(A或B),被不同地示出,由DataTemplate引起,为每种类型定义。

但是,有时候不只是TextBlock s。想象一下这些DataTemplates中有按钮。有时候您想用某些方法订阅Click事件。但是这些控件模板通常在ResourceDictionary中,所以在后面没有的代码来处理相应的处理程序。

我看到了三个不同的解决方案,但:

  • 创建具有隐藏文件的代码CustomResourceDictionary attatched
  • 覆盖的OnApplyTemplate方法(我真的不明白这一点,虽然)和订阅事件编程
  • 使用attatched消息并处理“ViewModel”中的UI逻辑。 丑!

实现此目的的最佳实践是什么?还是有更好的解决方案?那么表演呢?

+3

你有没有考虑过使用命令? – 2013-02-14 15:15:55

+0

也许选择'Button'控件并不适合这个目的。这不是关于在这个地方实施指挥,因为我想订阅诸如'SelectionChanged'事件的事件,*(希望这个事件存在于例如'ComboBox'上)。 – 2013-02-15 10:24:44

回答

0

你可以使用DelegateCommand来绑定你的按钮和ViewModel中的命令。

<Button Command="{Binding MyCommand}"/> 

视图模型:

public DelegateCommand MyCommand {get;set;} //INotifyPropertyChanged, etc. 

private void ExecuteMyCommand() 
{ 
    //Do stuff here. 
} 

public MyViewModel() 
{ 
    MyCommand = new DelegateCommand(ExecuteMyCommand); 
}