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に感謝します。