我想创建一个“FlipPanel”,它提供同一对象的两个不同视图。这是我正在采取的方法。
这是主页,它由一个 ItemsControl 组成,它的 ItemTemplate 是一个 FlipPanel。FlipPanel 公开了两个属性,它们定义了用于 Front 和 Back 的 DataTemplate。
<UserControl.Resources>
<ControlTemplate x:Key="MyFlipTemplate">
<StackPanel>
<Button Content="Flip" x:Name="PART_FlipButton"/>
<ContentPresenter Content="{TemplateBinding Content}" x:Name="PART_FlipContent"/>
</StackPanel>
</ControlTemplate>
<DataTemplate x:Key="Front">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Front"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="Back">
<StackPanel>
<TextBlock Text="Back"/>
<TextBlock Text="{Binding Description}"/>
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<StackPanel>
<ItemsControl x:Name="_items">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<SLTest:FlipPanel Template="{StaticResource MyFlipTemplate}" FrontDataTemplate="{StaticResource Front}" BackDataTemplate="{StaticResource Back}" Side="Front"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
主页的后面的代码非常简单,因为它只是将 ItemsControl 的 DataContext 设置为测试数据列表。
使用 System.Collections.Generic;
使用 System.Windows.Controls;
命名空间 SLTest
{
公共部分类 NewPage : UserControl
{
公共新页面()
{
初始化组件();
_items.ItemsSource = 物品;
}
公共 IList 项
{
得到
{
返回新列表
{
新的NewClass {名称=“名称1”,描述=“描述1”},
新的NewClass {名称=“名称2”,描述=“描述2”},
新的NewClass {名称=“名称3”,描述=“描述3”},
新的NewClass {名称=“名称4”,描述=“描述4”}
};
}
}
}
公共类 NewClass
{
公共字符串名称;
公共字符串描述;
}
}
FlipPanel 代码也相对简单,因为它尝试根据 Side DependencyProperty 更改 DataTemplate。问题似乎是 ContentPresenter 的 DataContext 在某些时候丢失了。在代码中,我有两条注释指示 ContentPresenter 的 DataContext 的有效性。
使用系统;
使用 System.Windows;
使用 System.Windows.Controls;
命名空间 SLTest
{
[模板部分(名称 = FlipPanel.ButtonPart,类型 = typeof(按钮))]
[模板部分(名称= FlipPanel.ContentPart,类型= typeof(ContentPresenter))]
公共部分类 FlipPanel:ContentControl
{
私有常量字符串 ButtonPart = "PART_FlipButton";
私有常量字符串 ContentPart = "PART_FlipContent";
公共枚举 FlipSide
{
正面,
后退
}
私人翻转 _flipSide;
公共静态只读 DependencyProperty SideProperty = DependencyProperty.RegisterAttached("FlipSide", typeof(FlipSide), typeof(FlipPanel), new PropertyMetadata(FlipSide.Front, FlipSidePropertyChanged));
public static readonly DependencyProperty FrontDataTemplateProperty = DependencyProperty.Register("FrontDataTemplate", typeof (DataTemplate), typeof (FlipPanel), null);
公共静态只读 DependencyProperty BackDataTemplateProperty = DependencyProperty.Register("BackDataTemplate", typeof(DataTemplate), typeof(FlipPanel), null);
私人按钮_flipButton;
私有 ContentPresenter _content;
公共翻转面板()
{
初始化组件();
}
公共数据模板 FrontDataTemplate
{
得到
{
返回 (DataTemplate) GetValue(FrontDataTemplateProperty);
}
放
{
SetValue(FrontDataTemplateProperty, 值);
}
}
公共数据模板 BackDataTemplate
{
得到
{
返回 (DataTemplate)GetValue(BackDataTemplateProperty);
}
放
{
SetValue(BackDataTemplateProperty, value);
}
}
私有静态无效 FlipSidePropertyChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
var flipSide = (FlipSide)e.NewValue;
var 翻转面板 = d 作为翻转面板;
flipPanel._content.ContentTemplate = flipSide == FlipSide.Front ?flipPanel.FrontDataTemplate : FlipPanel.BackDataTemplate;
}
公共覆盖无效 OnApplyTemplate()
{
_flipButton = GetTemplateChild(ButtonPart) 作为按钮;
_flipButton.Click += OnFlipClicked;
_content = GetTemplateChild(ContentPart) 作为 ContentPresenter;
// _content.DataContext 在这里有效...
_content.ContentTemplate = Side == FlipSide.Front ?前数据模板:后数据模板;
base.OnApplyTemplate();
}
私人无效 OnFlipClicked(对象发送者,RoutedEventArgs e)
{
// _content.DataContext 现在为 NULL!!!!
边 =(边 == FlipSide.Front)?FlipSide.Back : FlipSide.Front;
}
公共 FlipSide 侧
{
得到
{
返回(FlipSide)GetValue(SideProperty);
}
放
{
SetValue(SideProperty, 值);
}
}
}
}
有任何想法吗?
我不确定这是否是解决我的要求的正确方法,如果有更好的方法,我会欢迎任何进一步的建议。
谢谢