订阅DataTemplate中控件事件的最佳实践?

时间:2013-02-14 14:24:14

标签: c# wpf xaml

我有一个ControlTemplate用于自定义控件,看起来像这样(简化):

<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。想象一下,这些DataTemplates中有按钮。有时您希望使用某些方法订阅Click个事件。但是这些控件模板通常位于ResourceDictionary中,因此后面没有代码用于为对应的Click处理程序添加方法。

我看到了三种不同的解决方案:

  • 使用文件attatched
  • 后面的代码创建CustomResourceDictionary
  • 覆盖OnApplyTemplate方法(我真的不明白这一点)并以编程方式订阅事件
  • 使用attatched消息并在“ViewModel”中处理UI逻辑。 丑!

实现这一目标的最佳做法是什么?或者甚至有“更好”的解决方案?性能怎么样?

1 个答案:

答案 0 :(得分: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);
}