0

我有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为每种类型定义的 s 引起。

然而。有时不只是TextBlocks。想象一下这些数据模板中有按钮。有时您想Click使用某些方法订阅事件。但是这些控件模板通常在 . 中ResourceDictionary,因此没有代码用于放置相应Click处理程序的方法。

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

  • 创建带有附加文件代码的 CustomResourceDictionary
  • 覆盖OnApplyTemplate方法(不过我不太明白)并以编程方式订阅事件
  • 在“ViewModel”中处理附加消息并处理 UI 逻辑。丑陋的!

实现这一目标的最佳实践是什么?还是有什至“更好”的解决方案?那么性能呢?

4

1 回答 1

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);
}
于 2013-02-14T16:01:02.983 回答