0

データ モデルのいくつかの条件に基づいて、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 を書くことを避けるためにコンバーターを書くことができ、コンバーターは舞台裏でそれらの条件を調べますか?

4

1 に答える 1

0

次のコードでクラスを作成します。

public class MyTemplateSelector : DataTemplateSelector
{
    private static DataTemplate _eventsViewModel;
    private static DataTemplate EventsViewModel
    {
        get
        {
            if (_eventsViewModel== null)
                _eventsViewModel= Application.Current.FindResource("EventsViewModel") as DataTemplate;
            return _eventsViewModel;
        }
    }

    private static DataTemplate _plainViewModel;
    private static DataTemplate PlainViewModel
    {
        get
        {
            if (_plainViewModel== null)
                _plainViewModel= Application.Current.FindResource("PlainViewModel") as DataTemplate;
            return _plainViewModel;
        }
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if(item is EventsViewModel) return EventsViewModel;
        else if(item is PlainViewModel) return PlainViewModel;

    }
}

リソースタグのxaml:

<core:MyTemplateSelector x:Key="myTemplateSelector"/>

xamlで:

<ContentPresenter ContentSource="{Binding}" ContentTemplateSelector="{StaticResource myTemplateSelector}"/>
于 2012-10-24T17:45:23.657 に答える