0

我想使用以下代码动态更改 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功能。我的错误在哪里?

4

1 回答 1

0

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

这应该“按原样”工作 - 我没有看到任何会产生这种情况的问题(我快速检查了类似的示例,它适用于.ItemsSource = new List<string>{...}.

所以这不是罪魁祸首 - 但它并没有损害我的建议 - 将适当的 MVVM 绑定到属性,制作列表ObservableCollection<>- 并且始终建议使用更多higher-level对象(而不仅仅是string)作为您的项目(在许多方面都有帮助具有类似问题的绑定案例-该对象实现INotifyPropertyChanged等-并且您绑定到那里的“属性”,而不是整个对象)。

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

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

你应该设置一个重复这一点的小入门 - 谁知道它可能会帮助你意识到你做错了什么。

于 2013-04-29T15:45:30.600 回答