データ モデルのいくつかの条件に基づいて、DockPanel/TextBlock にデータをドラッグ アンド ドロップするためのマウスおよびキーボード イベントを追加するシナリオがあります。その条件が存在しない場合、コードでそれらのイベントをリッスンしたくありません。
<!-- Data Template with all event handlers -->
<DataTemplate DataType="{x:Type ViewModels:EventsViewModel}">
<DockPanel Name="dpnMain">
<Button Name="btnSourceLink" DockPanel.Dock="Right" HorizontalAlignment="Right" Padding="0"
ClickMode="Press"
Click="Button_OnMouseButtonUp"
PreviewMouseDown="Button_DragDataMouseDown"
Content="{Binding Value, Converter={StaticResource RegionalDataFormatConverter}}"
ToolTip="{Binding Tooltip}"
ToolTipService.IsEnabled="{Binding IsTooltipAvailable}" />
<StackPanel Name="spnWithDragNDrop" DockPanel.Dock="Left">
<TextBlock HorizontalAlignment="Left" TextWrapping="NoWrap" ClipToBounds="True" Padding="0"
Text="{Binding Label}" MouseEnter="OnMouseEnter" MouseLeave="OnMouseLeave"
MouseLeftButtonUp="OnMouseLeftButtonUp"
PreviewMouseDown="DragDataMouseDown"
ToolTip="{Binding Label}"
Width="{Binding ElementName=spn, Path=ActualWidth, Mode=OneWay,
Converter={StaticResource WidthFromParent}, ConverterParameter=10}"/>
</StackPanel>
</DockPanel>
<DataTemplate>
<!-- Data Template without event handlers -->
<DataTemplate DataType="{x:Type ViewModels:PlainViewModel}">
<DockPanel Name="dpnMain">
<Button Name="btnSourceLink" DockPanel.Dock="Right" HorizontalAlignment="Right" Padding="0"
ClickMode="Press"
Click="Button_OnMouseButtonUp"
PreviewMouseDown="Button_DragDataMouseDown"
Content="{Binding Value, Converter={StaticResource RegionalDataFormatConverter}}"
ToolTip="{Binding Tooltip}"
ToolTipService.IsEnabled="{Binding IsTooltipAvailable}" />
<StackPanel Name="spnWithoutDragNDrop" DockPanel.Dock="Left">
<TextBlock HorizontalAlignment="Left" TextWrapping="NoWrap" ClipToBounds="True" Padding="0"
Text="{Binding Label}"
ToolTip="{Binding Label}"
Width="{Binding ElementName=spn, Path=ActualWidth, Mode=OneWay,
Converter={StaticResource WidthFromParent}, ConverterParameter=10}"/>
</StackPanel>
</DockPanel>
<DataTemplate>
<!-- Content Control will select the appropriate data template based on the view model it is bound to -->
<ContentControl Focusable="False" Padding="0" Content="{Binding}"/>
2 つの異なるデータ テンプレートを記述したくなく、viewModel タイプに基づいて選択したいと考えています。これらのイベントにバインドするある種の ValueConverters が必要です。
とにかく別の DataTemplates と View Model を書くことを避けるためにコンバーターを書くことができ、コンバーターは舞台裏でそれらの条件を調べますか?