2011-05-09 107 views
0

在我的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; 
} 
+0

你只有onee您的视图模型的DataTemplate,所以它将被应用于每个内容的控制。如果你想使用不同的模板 - 明确应用它。 – vorrtex 2011-05-09 13:22:13

回答

0

您需要做的是明确指定要使用的数据模板。为了做到这一点只是在预览控件PreviewObject属性一起添加模板特性:

public static readonly DependencyProperty _previewObjectTemplateProperty = 
    DependencyProperty.Register("PreviewObjectTemplate", typeof(DataTemplate), typeof(ObjectPreview)); 

    public DataTemplate PreviewObjectTemplate 
    { 
    get { return (DataTemplate)GetValue(_previewObjectTemplateProperty); } 
    set { SetValue(_previewObjectTemplateProperty, value); } 
    } 

然后,在ObjectPreview.xaml添加绑定到PreviewObjectTemplate属性ContentTemplate属性:

<Viewbox Grid.Row="1" Name="treeviewViewBox" 
     Stretch="Uniform" 
     IsEnabled="False">  
    <ContentControl Name="treeViewItemViewModel" 
        Content="{Binding PreviewObject}" 
        ContentTemplate="{Binding PreviewObjectTemplate}" > 
    </ContentControl> 
</Viewbox> 

最后,给出数据模板的关键字,并在声明时指定一个对其的引用:ObjectPreview

<DataTemplate x:Key="FullViewTemplate" DataType="{x:Type vm:TrialSiteViewModel}"> 
    <vw:TrialSiteView /> 
</DataTemplate> 

...

<ToolTip Style="{x:Null}"> 
<ToolTip.ContentTemplate> 
    <DataTemplate>   
    <localtools:ObjectPreview 
    PreviewObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=DataContext}" 
    PreviewObjectTemplate="{StaticResource FullViewTemplate}" 
    />   
    </DataTemplate> 
</ToolTip.ContentTemplate>