Wpf:将参数传递给ResourceDictionary

时间:2010-11-28 14:26:01

标签: wpf resourcedictionary

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

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

安德鲁

2 个答案:

答案 0 :(得分:1)

您知道可以merge your Resource Dictionaries然后根据DataTemplate中的需要引用这些词典中的TreeView

答案 1 :(得分:0)

资源词典听起来像是一种略微特殊的方式。资源字典都是关于共享实例的 - 它们允许您使用来自多个地方的单个实例(例如样式,模板,画笔或其他)。它们实际上并不是一种将UI划分为简化单个Xaml文件的机制。

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

大多数情况下,当我定义数据模板时,我只包含一个用户控件。如果这变得更复杂,我会将用户控件拆分为更多用户控件。

根据您的描述,听起来您的Xaml文件变得很大,因为您有四个大型分层数据模板。如果您将每个模板的主体转换为用户控件,那么您的四个模板现在变得非常简单 - 如下所示:

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

并且您很可能不再需要将这些模板放入单独的文件中。但是因为每个模板的内容现在都在用户控件中,所以这为您提供了放置代码的位置。

您提到需要对父控件的引用。这让我很担心 - 这听起来好像你的代码背后有太多的代码。但有一件事......你可以通过在用户控件上定义一个名为ParentControl的依赖属性来解决这个问题,然后将其放在模板中:

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

但坦率地说,一旦我发现自己处于需要这个位置的位置,我就会问自己:我是如何让自己进入一个看似必要的位置,我该怎么办才能解决这个问题?