我正在尝试使用代码隐藏来支持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的角度映射最后一行的引用,但我不确定为什么它应该是不同的。
感谢您的任何想法。
比尔
答案 0 :(得分:3)
这是因为代码不再出现在窗口类中。您必须再次找到它(或者您想要放置模板的任何控件)。
Window parentWindow = Window.GetWindow(btn);
itm.SetValue(Window.ContentTemplateProperty, parentWindow.FindResource("DetailedTemplate") as DataTemplate);
答案 1 :(得分:3)
我认为使用命令会更清晰。