我希望通过以下代码动态更改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
函数。我的错误在哪里?
答案 0 :(得分:0)
在这里发表一些评论后...... (注意:这有点笼统,但我不能更具体,不需要更多的代码来反映问题)
这应该“按原样”运行 - 我没有看到会产生任何问题(我快速检查类似的例子,它与.ItemsSource = new List<string>{...}
一起使用。
所以这不是罪魁祸首 - 但它并没有伤害我的建议 - 制作一个合适的MVVM绑定到属性,制作列表ObservableCollection<>
- 而且总是建议有更多higher-level
对象(而不仅仅是string
)作为您的项目(在许多情况下有助于绑定类似问题 - 该对象实现INotifyPropertyChanged
等) - 并且您绑定到那里的'property',而不是整个对象)。
另一个错误也表明了一些问题。
最后将两个contentControl绑定在一起 - 您通常不需要这样的事件。您可以直接使用样式或XAML中的Triggers
- 但大多数情况下只将两者绑定到视图模型中的属性 - 并处理属性“setter”中的“更改”。
你应该提出一个重复这个的小引物 - 谁知道它可能会帮助你意识到你做错了什么。