绑定没有路径时更新

时间:2016-06-02 13:50:14

标签: wpf data-binding

我有以下内容:

<DataTemplate DataType="{x:Type vm:MyViewModel}">
  <Grid>
    ...
    <ContentControl Content="{Binding}"
                    ContentTemplateSelector="{StaticResource MySelector}"/>
    ...
  </Grid>
</DataTemplate>

其中MySelector提供了MyViewModel所指示的MyViewModel.ViewName的不同视图,以及

class MyViewModel : INotifyPropertyChanged
{
    ...
    public string ViewName
    {
        get { return _viewName; }
        set
        {
            _viewName = value;
            OnPropertyChanged(() => ViewName);
        }
    }
    ...
}

如何在ViewName更改时让内容控件中的绑定更新?

注意我还尝试在MyViewModel上创建一个只返回自身的属性,绑定到该属性,然后在{{1} PropertyChanged为该属性引发ViewName变化。

<DataTemplate DataType="{x:Type vm:MyViewModel}">
  <Grid>
    ...
    <ContentControl Content="{Binding This}"
                    ContentTemplateSelector="{StaticResource MySelector}"/>
    ...
  </Grid>
</DataTemplate>

class MyViewModel : INotifyPropertyChanged
{
    ...
    public string ViewName
    {
        get { return _viewName; }
        set
        {
            _viewName = value;
            OnPropertyChanged(() => ViewName);
            OnPropertyChanged(() => This);
        }
    }
    public MyViewModel This { get { return this; } }
    ...
}

但在ViewName更改时,我的模板选择器不会被调用。

1 个答案:

答案 0 :(得分:2)

所以看起来雷切尔让我得到了正确答案(或者至少是有效的答案)。

感觉有点hacky,但它确实有效。我将ContentControl子类化并覆盖了OnContentChanged()方法,以便在内容更改时重新调用模板选择器。

public class DynamicTemplatedContentControl : ContentControl
{
    protected override void OnContentChanged(object oldContent, object newContent)
    {
        base.OnContentChanged(oldContent, newContent);

        if (ContentTemplateSelector == null) return;

        ContentTemplate = ContentTemplateSelector.SelectTemplate(newContent, this);
    }
}

然后在我的XAML中,我只使用第二种方法(在上面的问题中)创建一个绑定我的内容的This属性。