2010-11-28 98 views
0

有没有办法将参数传递给资源字典?我认为我可以附加一个代码来指定事件处理程序,但不幸的是,我还需要从事件处理程序访问父控件的引用。我相信可以通过为xaml中的资源字典指定一个x:Class属性,然后在同一个文件夹中创建一个类,其文件名类似[资源字典名称] .xaml.cs之类来附加代码隐藏。Wpf:将参数传递给ResourceDictionary

其目的是为我在单个树视图控件中使用的四个分层数据模板分离代码。树视图的xaml看起来有点长和难看,所以我希望将它分解成四个资源字典。任何想法都欢迎!

安德鲁

回答

0

资源字典听起来像一个有点奇怪的方式来做到这一点。资源字典都是关于共享实例 - 它们让你可以在多个地方使用一个实例(例如风格,模板,画笔或其他)。它们并不是真正的用于分割用户界面以简化各个Xaml文件的机制。

将过度复杂的Xaml文件分割成几个更易于管理的小文件的通常机制是用户控制。 (资源字典合并当你已经有一个资源字典时就会起作用,并且它太大了,但是你通常不会引入一个资源字典来开始分解东西,相反,资源字典倾向于鼓励过度大的Xaml文件,这就是为什么字典合并必须首先发明的原因!)

大多数情况下,当我定义数据模板时,我将它仅包含一个用户控件。如果这变得更加复杂,我会将该用户控件分成更多的用户控件。

从您的描述来看,这听起来像您的Xaml文件变得很大,因为您已经有四个大型的分层数据模板。如果你把每个模板的身体,把它变成一个用户控件,你的4个模板现在将变得非常简单 - 是这样的:

<HierarchicalDataTemplate x:Key="t1" ItemsSource="{Binding Path=Children}"> 
    <loc:TreeItemTypeOne /> 
</HierarchicalDataTemplate> 

和你最有可能不再需要把这些模板为单独的文件。但是,因为每个模板的内容现在都在用户控件中,所以可以让您放置代码。

您提到需要对父控件的引用。这让我很担心 - 这听起来像是你的代码隐藏了太多的代码。但有一件事的时候,你可以通过定义用户控件调用ParentControl依赖属性解决这个问题,然后把这个模板:

<loc:TreeItemTypeOne 
    ParentControl="{Binding RelativeSource= 
     {RelativeSource AncestorType=loc:ParentControlType}}" /> 

但坦率地说,当我发现自己在我需要这个职位的时候,我问自己:我如何让自己进入一个看起来有必要的位置,我能做些什么来解决这个问题?

+0

谢谢伊恩,这是一个很棒的答案。我在代码隐藏方面遇到很多麻烦的原因是因为拖放功能。每个分层数据模板都有一个可以拖动到树中另一个项目的堆栈面板。我必须努力实现这一点,然后才能正确回答答案,但我会回来的。对于我来说,要想得出这些结论将会一直持续下去!很好的答案! – Andrew 2010-11-28 15:09:24

1

你知道你可以merge your Resource Dictionaries然后引用DataTemplate根据需要TreeView内的字典中。

+0

请注意,密钥不能在单个ResourceDictionary中复制。所以你不能在两个资源词典中使用同一个键的风格,这些资源合并成一个更大的资源字典。没有真正的相关性,但值得一提。 – basarat 2010-11-28 14:33:30