ContentControl不会更改内容 - 从未调用过的函数

时间:2013-04-27 12:55:25

标签: xaml windows-8 contentcontrol datatemplateselector

我希望通过以下代码动态更改AppBar中的内容:

<Page.Resources>
    <local:AppBarSelector x:Key="myAppBarSelector"/>
</Page.Resources>

<Page.BottomAppBar>
    <AppBar>
        <ContentControl Content="{Binding SelectedItem, ElementName=listBox}" ContentTemplateSelector="{StaticResource myAppBarSelector}">
            <ContentControl.Resources>
                <DataTemplate x:Key="1">
                    <TextBlock Text="Hallo Welt 1" Foreground="White" />
                </DataTemplate>

                <DataTemplate x:Key="2">
                    <TextBlock Text="Hallo Welt 2" Foreground="White" />
                </DataTemplate>
            </ContentControl.Resources>
        </ContentControl>
    </AppBar>
</Page.BottomAppBar>

这是我的代码背后:

public class AppBarSelector : DataTemplateSelector
{
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        Debug.WriteLine((string)item);
        if (item == null) return base.SelectTemplateCore(item, container);

        var contentControl = (ContentControl)container;
        var templateKey = (string)item;

        return (DataTemplate)contentControl.Resources[templateKey];
    }
}

但这种方法是神经质的。甚至是Debug.WriteLine函数。我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

在这里发表一些评论后...... (注意:这有点笼统,但我不能更具体,不需要更多的代码来反映问题)

这应该“按原样”运行 - 我没有看到会产生任何问题(我快速检查类似的例子,它与.ItemsSource = new List<string>{...}一起使用。

所以这不是罪魁祸首 - 但它并没有伤害我的建议 - 制作一个合适的MVVM绑定到属性,制作列表ObservableCollection<> - 而且总是建议有更多higher-level对象(而不仅仅是string)作为您的项目(在许多情况下有助于绑定类似问题 - 该对象实现INotifyPropertyChanged等) - 并且您绑定到那里的'property',而不是整个对象)。

另一个错误也表明了一些问题。

最后将两个contentControl绑定在一起 - 您通常不需要这样的事件。您可以直接使用样式或XAML中的Triggers - 但大多数情况下只将两者绑定到视图模型中的属性 - 并处理属性“setter”中的“更改”。

你应该提出一个重复这个的小引物 - 谁知道它可能会帮助你意识到你做错了什么。