Кодовая часть для DataTemplate в ResourceDictionary - PullRequest
4 голосов
/ 12 апреля 2011

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

Ответы [ 2 ]

3 голосов
/ 12 апреля 2011

Я думаю, что использование команд было бы намного чище.

3 голосов
/ 12 апреля 2011

Это потому, что код больше не находится в классе окна. Вы должны найти его снова (или любой другой элемент управления, на котором хотите разместить шаблон).

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