我有以下内容:
<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
更改时,我的模板选择器不会被调用。
答案 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
属性。