绑定到UserControl DataContext:在某些属性更改时更新ContentTemplateSelector

时间:2016-04-26 03:46:26

标签: .net wpf data-binding datatemplate

我有一个UserControl,其中关键的视觉元素如下所示:

<ContentPresenter Content="{Binding}"
     ContentTemplateSelector="{StaticResource MStatusDisplaySelector}" />

此元素的DataContext(即绑定目标)是UserControl本身。 MStatusDisplaySelector是一个复杂的选择器,它会根据此DataTemplate的几个属性选择UserControl(这些属性都是简单的DependencyProperty)。

问题是,当任何这些属性发生变化时,可能需要选择不同的模板,我想更新ContentPresenter。这显然不会发生。解决这个问题的最佳方法是什么?

理想情况下,我希望避免在每个涉及的属性中实现更改回调。这不仅过于冗长,而且模板选择器可能需要稍后使用不同的属性集,并且保持同步并不方便。但是,可以在任何属性更改上更新模板。

P.S。假设MStatusDisplaySelector逻辑过于复杂,无法简化为Style.Triggers的传统样式选择器。我希望它留在代码隐藏中。

1 个答案:

答案 0 :(得分:1)

将此添加到您的UserControl代码:

    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        if (e.OldValue != null && e.NewValue != null && e.Property.ToString() == "Title")
        {
            System.Diagnostics.Debug.WriteLine(e.Property.ToString() + " > " + e.OldValue.ToString() + " : " + e.NewValue.ToString());
            /* You can call your TemplateSelector method here, or put some code here */
        }
        base.OnPropertyChanged(e);
    }

在这个重写的方法中,您可以检查调用此方法的Property,并采取相应的相应措施。