2

EventTrigger に次の Binding があります。

<ControlTemplate.Triggers>
    <EventTrigger RoutedEvent="PreviewMouseDown">
        <SoundPlayerAction Source="{Binding Path=SoundFile, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource soundFileConverter}}" />
    </EventTrigger>
    ...

プロセスは次のとおりです。カスタム コントロール (そのテンプレート) には、列挙型であるSoundFileという名前のプロパティがあります。コンバーターでは、この列挙値を Uri に変換して、SoundPlayerAction に渡す必要があります。

問題は次のとおりです。とにかく、コンバーターは呼び出されません。出力ウィンドウに次のエラーが表示されます。

ターゲット要素の管理 FrameworkElement または FrameworkContentElement が見つかりません。BindingExpression:Path=SoundFile; DataItem=null; ターゲット要素は 'SoundPlayerAction' HashCode=46763000); ターゲット プロパティは 'Source' (タイプ 'Uri')

結合式の何が問題になっていますか?

編集:

より良い概要のために、コントロールのテンプレート全体を次に示します。

<Style TargetType="{x:Type controls:Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:Button}">
                <Border Name="Border"
                        Background="{TemplateBinding Background}"
                        BorderBrush="Transparent"
                        BorderThickness="0">
                    <Border.CornerRadius>
                        <MultiBinding Converter="{StaticResource areaCornerRadiusConverter}">
                            <MultiBinding.Bindings>
                                <Binding Path="RoundType" RelativeSource="{RelativeSource TemplatedParent}" />
                                <Binding Path="ActualHeight" RelativeSource="{RelativeSource TemplatedParent}" />
                            </MultiBinding.Bindings>
                        </MultiBinding>
                    </Border.CornerRadius>
                    <TextBlock Margin="{Binding Path=RoundType,
                                                RelativeSource={RelativeSource TemplatedParent},
                                                Converter={StaticResource buttonMarginConverter}}"
                               FontSize="{TemplateBinding FontSize}"
                               Style="{StaticResource innerTextBlock}"
                               Text="{TemplateBinding Text}" />
                </Border>
                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="PreviewMouseDown">
                        <SoundPlayerAction Source="{Binding Path=SoundFile, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource soundFileConverter}}" />
                    </EventTrigger>                        
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

編集2:

別の方法で試してみました。SoundPlayerAction の name 属性をPART_SoundPlayerActionに設定し、 GetTemplateChildを使用してコード ビハインドから取得します。ただし、GetTemplateChildは常に null を返します。それは本当に迷惑です。何も機能していないようです...

編集3:

Blachshma の回答により、コントロールの初期化中にコンバーターが呼び出されることがわかりました。ただし、プロパティが変更されている場合はそうではありません。さらに、コンバーターによって返された値は、Source として SoundPlayerAction に適用されません。

BindingProxy を実装しました。

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public SoundFile Data
    {
        get { return (SoundFile)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(SoundFile), typeof(BindingProxy), new UIPropertyMetadata(SoundFile.None));
}

そして、 を に変更しPath=Data.SoundFileましたPath=Data。間違いはありませんか?

編集4:

MakeSoundCommand を使用したソリューションは完全に機能しています。Blachshmaに感謝します。

4

1 に答える 1