在我的MVVM应用程序中,我有一个树形视图来表示数据库中的记录。我的意见,并在的ViewModels资源字典链接这样wpf用户控件模板
<DataTemplate DataType="{x:Type vm:TrialSiteViewModel}">
<vw:TrialSiteView />
</DataTemplate>
我想,当用户使用工具提示悬停在图标显示视图的预览。我在TreeView HierarchicalDataTemplate是这个
<HierarchicalDataTemplate DataType="{x:Type vm:TrialSiteViewModel}"
ItemsSource="{Binding Path=Children}">
...
<Button Style="{StaticResource previewButtonStyle}">
<Button.ToolTip>
<ToolTip Style="{x:Null}">
<ToolTip.ContentTemplate>
<DataTemplate>
<localtools:ObjectPreview
PreviewObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=DataContext}"
/>
</DataTemplate>
</ToolTip.ContentTemplate>
</ToolTip>
</Button.ToolTip>
</Button>
</StackPanel>
</HierarchicalDataTemplate>
这正确拿起TrialSiteViewModel是在DataContext的树型视图。
ObjectPreview使用视框和ContentControl中显示的记录的视图
<Viewbox Grid.Row="1" Name="treeviewViewBox"
Stretch="Uniform"
IsEnabled="False">
<ContentControl Name="treeViewItemViewModel"
Content="{Binding PreviewObject}">
</ContentControl>
</Viewbox>
和后面的代码包含依赖属性
public partial class ObjectPreview : UserControl
{
public ObjectPreview()
{
InitializeComponent();
}
public static readonly DependencyProperty _previewObjectProperty =
DependencyProperty.Register("PreviewObject", typeof(TreeViewItemViewModel), typeof(ObjectPreview));
public TreeViewItemViewModel PreviewObject
{
get { return (TreeViewItemViewModel)GetValue(_previewObjectProperty); }
set { SetValue(_previewObjectProperty, value); }
}
}
时遇到的问题是,所使用的模板显示对象与树视图中使用的相同。这只是显示一个图标和一个对象摘要(即主键和一个或两个关键字段),而不是视图TrialSiteView中定义的整个模板。如果我修改代码以使用TrialSiteViewModel上的按钮Command并将其注入到ObjectPreview中,我可以在后面的代码中设置contentcontrol,并使用TrialSiteView。
我猜,以某种方式模板是从TreeViewItem推断。任何人都可以告诉我如何确保工具提示使用TrialSiteView?
UPDATE
好了,我已经解决了这个问题,但不得不求助于后面的代码,并删除该用户控件,并直接把视图的提示。关键是从资源获取数据模板。我之前曾试图通过将键分配给数据模板来完成此操作,但是我的代码有缺陷或无法使用。无论如何,这可行,但不是首选的Xaml解决方案。
private void PreviewObject_MouseEnter(object sender, MouseEventArgs e)
{
Image image = (Image)sender;
var key = new System.Windows.DataTemplateKey(image.DataContext.GetType());
var datatemplate = (DataTemplate)this.FindResource(key);
ToolTip tooltip = new ToolTip();
tooltip.Style = VisualUtils.GetResource<Style>("ControlTemplates.xaml", "toolTipWithContentStyle");
tooltip.MaxWidth = 460;
ContentControl contentcontrol = new ContentControl();
contentcontrol.ContentTemplate = datatemplate;
contentcontrol.Content = image.DataContext as TreeViewItemViewModel;
Viewbox viewbox = new Viewbox();
viewbox.Stretch = Stretch.Uniform;
viewbox.Child = contentcontrol;
tooltip.Content = viewbox;
image.ToolTip = tooltip;
}
你只有onee您的视图模型的DataTemplate,所以它将被应用于每个内容的控制。如果你想使用不同的模板 - 明确应用它。 – vorrtex 2011-05-09 13:22:13