1

ResourceDictionary含む がありDataTemplateます。この DataTemplate の Resources 内で、CommandBindingCollection. 私の ResourceDictionary には、Executed/CanExecute のハンドラーを宣言する分離コード ファイルがあります。

私が抱えている問題は、CommandBindingCollectionから取得するResourceDictionaryと、Executed/CanExecute ハンドラーが割り当てられないことです。デバッガーを使用すると、ハンドラーが null であることがわかります。それはなぜですか、どうすれば修正できますか?

ResourceDictionary XAML:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="Test"
                    x:Class="Test.MyResourceDictionary">

    <DataTemplate x:Key="Template"
                  x:Name="Template">
        <DataTemplate.Resources>
            <CommandBindingCollection x:Key="CommandBindings">
                <CommandBinding Command="local:TestCommands.Test"
                        Executed="testExecuted" 
                        CanExecute="testCanExecute" />
            </CommandBindingCollection>
        </DataTemplate.Resources>

        <!-- More stuff here -->

    </DataTemplate>
<ResourceDictionary/>

ResourceDictionary コードビハインド:

public partial class MyResourceDictionary: ResourceDictionary
{
    public MyResourceDictionary() 
    { 
        InitializeComponent(); 
    } 

    private void testExecuted(object sender, ExecutedRoutedEventArgs e)
    {

    }

    private void testCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {

    }
}

アップデート

DataTemplate の適用に使用する AvalonDock でこれを使用DataTemplateSelectorしています。

テンプレートをロードする方法は次のとおりです。

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
    if (item is TestViewModel)
    {
        ResourceDictionary res = Application.LoadComponent(new Uri("/MyResourceDictionary.xaml", UriKind.Relative)) as ResourceDictionary;
        DataTemplate template = res["Template"] as DataTemplate;
        if(template != null)
        {
            CommandBindingCollection commandBindings = 
                template.Resources["CommandBindings"] as CommandBindingCollection;

            if(commandBindings != null)
            {
                foreach(var binding in commandBindings)
                {
                     // add commandbinding to the container control
                     // here, using the debugger i can see that the handlers for the commandbinding
                     // are always null (private variables that I can only see using debugger)
                }
            }
            return template;
        }
    }
    return base.SelectTemplate(item, container);
}

CommandBindingCollectionを に直接移動して、次のResourceDictionary方法でアクセスする場合:

CommandBindingCollection commandBindings = 
            res["CommandBindings"] as CommandBindingCollection;

次に、ハンドラーが正しく設定されます。DataTemplate のリソース内で宣言するときに、イベント ハンドラーのデリゲートを設定できないのはなぜでしょうか。

4

1 に答える 1

1

私の問題は、4.5 で修正されたように見える .NET フレームワークのバグに関連していました。

4.0 の問題に対するホットフィックスがあります: http://support.microsoft.com/kb/2464222

私の場合、ホットフィックスを適用すると問題が解決しました。私の推測では、CommandBindingCollection XAML パーサーのどこかで、例外がサイレントに処理されます。

于 2012-11-15T18:52:29.337 に答える