Я пытаюсь использовать программный код для поддержки обработчика событий в DataTemplate. Приведенный ниже код отлично работает, когда он является кодом для окна, но не для 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, но я не уверен, почему она должна отличаться.
Спасибо за любые мысли.
Bill