ResourceDictionary中DataTemplate的代码隐藏

时间:2011-04-12 04:15:07

标签: wpf mvvm datatemplate code-behind resourcedictionary

我正在尝试使用代码隐藏来支持DataTemplate中的事件处理程序。下面的代码在Window的代码隐藏时工作正常,但对于ResourceDictionary则不行。当放入ResourceDictionary的代码隐藏时,代码甚至不会编译。

我知道Commands是更好的选择,但这主要是一个测试,以确保我可以在需要时处理ResourceDictionary中的资源事件。我的目标是更好地组织我的代码,但这不是我认为单独的ResourceDictionary文件提供的简单的“包含”行为。

在MainWindow.xaml:

    <Window x:Class="Wizbang.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:DevComponents.WpfEditors;assembly=DevComponents.WpfEditors"
        xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
        xmlns:local ="clr-namespace:Wizbang"
        xmlns:m ="clr-namespace:Wizbang.Model"
        xmlns:vm="clr-namespace:Wizbang.ViewModel"
        xmlns:vw="clr-namespace:Wizbang.View"
        DataContext="{Binding Path=Main, Source={StaticResource Locator}}"
        Title="Wizbang" Height="760" Width="1335" WindowStartupLocation="CenterScreen">

        <Window.Resources>
            <ResourceDictionary>
                 <ResourceDictionary Source="Resources/MainWindowResources.xaml" />
            </ResourceDictionary>
        </Window.Resources>

在代码隐藏的MainWindow.xaml.cs和MainWindowResources.xaml.cs中,代码相同:

private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            //switch item template
            Button btn = (Button)sender;
            //command contains the list item
            ContentControl itm = (ContentControl)btn.CommandParameter;

            itm.SetValue(ContentTemplateProperty, this.FindResource("DetailedTemplate") as DataTemplate);

            //this.UpdateLayout();

        }

当我将ResourceDictionary内联在MainWindow.xaml中,并将代码隐藏在MainWindow.xaml.cs中时,一切正常。当我尝试为ResourceDictionary使用单独的文件时,代码不会编译。编译器抱怨最后一行:

itm.SetValue(ContentTemplateProperty, this.FindResource("DetailedTemplate") as DataTemplate);

this.FindResource()不是有效的方法,找不到“ContentTemplateProperty”:

  

错误4名称   'ContentTemplateProperty'没有   存在于当前   上下文C:... \ Visual Studio   2010 \ Projects \ Wizbang \ Wizbang \ Resources \ MainWindowResources.xaml.cs 36 26 Wizbang

     

错误5'Wizbang.Resources.MainWindowResources'   不包含的定义   'FindResource'并没有扩展方法   'FindResource'接受第一个   类型的论证   'Wizbang.Resources.MainWindowResources'   可以找到(你错过了吗?   使用指令或程序集   参考?)C:... \ Visual Studio   2010 \ Projects \ Wizbang \ Wizbang \ Resources \ MainWindowResources.xaml.cs 36 56 Wizbang

如果删除最后一行,代码将编译并运行,但该按钮没有任何功能。我认为我的问题是从ResourceDictionary的角度映射最后一行的引用,但我不确定为什么它应该是不同的。

感谢您的任何想法。

比尔

2 个答案:

答案 0 :(得分:3)

这是因为代码不再出现在窗口类中。您必须再次找到它(或者您想要放置模板的任何控件)。

Window parentWindow = Window.GetWindow(btn);
itm.SetValue(Window.ContentTemplateProperty, parentWindow.FindResource("DetailedTemplate") as DataTemplate);

答案 1 :(得分:3)

我认为使用命令会更清晰。