Изменить шаблон xaml по типу

Ниже приведен фрагмент DataTemplate, который определяет полосы команд (кнопок с изображениями) для связи с клиентами. В настоящее время определены для телефонных контактов, есть еще несколько команд, поэтому я хочу использовать это для других типов методов контакта (электронная почта и т. Д.)

То, как оно разработано и модели представления позади него, есть только две вещи, которые нужно изменить, чтобы сделать это:

  1. Изображение и всплывающая подсказка для кнопки ContactCommand
  2. Вся последняя кнопка

Кажется, наиболее подходящим подходом было бы использование всей кнопки в качестве самого DataTemplate с DataType, определенным как в нижней части этого поста, но я не зацикливался на том, как исходный DataTemplate будет использовать это. Я также никогда не использовал DataTemplateSelector, хотя это звучит многообещающе.

Каков наилучший подход? Как будет выглядеть код?

Ура,
Berryl

текущий DataTemplate

<DataTemplate x:Key="TelecomNumbersControlCommands">

    <DataTemplate.Resources>

        <!-- Image Style -->
        <Style TargetType="{x:Type Image}">
            <Setter Property="Height" Value="16" />
            <Setter Property="Width" Value="16" />
        </Style>

    </DataTemplate.Resources>

    <StackPanel Orientation="Horizontal" Margin="5,0,5,0">

        <Button Command="{Binding AddCommand}" >
            <Image Source="{resx:Resx Key=Img_Simplicio_Add, ResxName=Presentation.Resources.MasterDetail}" />
            <Button.ToolTip>
                <TextBlock>
                    <TextBlock.Text>
                        <resx:Resx Key="Subject_AddNew_ToolTip" BindingPath="SubjectVm.DisplayName" ResxName="Presentation.Resources.MasterDetail"/>
                    </TextBlock.Text>
                </TextBlock>
            </Button.ToolTip>
        </Button>

        <Button Command="{Binding ContactCommand}" >
            <Image Source="{resx:Resx Key=Img_Telephone, ResxName=Smack.Parties.Presentation.Resources.PartyDetailView}" />
            <Button.ToolTip>
                <TextBlock>
                    <TextBlock.Text>
                        <resx:Resx Key="ContactCommand_Telephone_Tooltip" BindingPath="SelectedVm" ResxName="Smack.Parties.Presentation.Resources.PartyDetailView"/>
                    </TextBlock.Text>
                </TextBlock>
            </Button.ToolTip>
        </Button>

        </Button>

        <Button Command="{Binding SetDefaultAreaCodeCommand}" >
            <Image Source="{resx:Resx Img_Widget, ResxName=Presentation.Resources.MasterDetail}" />
            <Button.ToolTip>
                <TextBlock>
                    <TextBlock.Text>
                        <resx:Resx Key="Subject_Settings" BindingPath="SubjectVm.DisplayName" ResxName="Presentation.Resources.MasterDetail"/>
                    </TextBlock.Text>
                </TextBlock>
            </Button.ToolTip>
        </Button>

        ...

    </StackPanel>

</DataTemplate>

Для Рейчел

Пересмотренная кнопка с неявными шаблонами данных

<Button Command="{Binding ContactCommand}" >
    <Button.Resources>
        <DataTemplate DataType="{x:Type CmTypes:TelecomNumberPcmShellVm}">
            <Image Source="{resx:Resx Key=Img_Telephone, ResxName=Presentation.Resources.PartyDetailView}" >
                <Image.ToolTip>
                    <TextBlock>
                        <TextBlock.Text>
                            <resx:Resx 
                                Key="ContactCommand_Telephone_Tooltip" 
                                BindingPath="SelectedVm" ResxName="Presentation.Resources.PartyDetailView"/>
                        </TextBlock.Text>
                    </TextBlock>
                </Image.ToolTip>
            </Image>
        </DataTemplate>
    </Button.Resources>
        <DataTemplate DataType="{x:Type CmTypes:EmailPcmShellVm}">
            <Image Source="{resx:Resx Key=Img_Email, ResxName=Presentation.Resources.PartyDetailView}" >
                <Image.ToolTip>
                    <TextBlock>
                        <TextBlock.Text>
                            <resx:Resx 
                                Key="ContactCommand_Email_Tooltip" 
                                BindingPath="SelectedVm" ResxName="Presentation.Resources.PartyDetailView"/>
                        </TextBlock.Text>
                    </TextBlock>
                </Image.ToolTip>
            </Image>
        </DataTemplate>
</Button>

Object Model

public class PcmShellVm<TCm> : SatelliteViewModel<Party, HashSet<PartyContactMechanism>> 
    where TCm : ContactMechanism
{
    // commands...
}

public class TelephoneNumberPcmShellVm : PcmShellVm<Telephone>
{
    ...
}

public class EmailPcmShellVm : PcmShellVm<Email>
{
    ...
}

Объектная модель

public class PcmShellVm<TCm> : SatelliteViewModel<Party, HashSet<PartyContactMechanism>> 
    where TCm : ContactMechanism
{
    // commands...
}

public class TelephoneNumberPcmShellVm : PcmShellVm<Telephone>
{
    ...
}

public class EmailPcmShellVm : PcmShellVm<Email>
{
    ...
}

1 ответ

Решение

Ваш DataTemplate в вашем последнем блоке кода не работает, потому что вы кладете DataTemplate в Button.Content, Если вы положите его в <Button.Resources>, это должно работать, обеспечивая Button.Content имеет тип CmTypes:TelecomNumberPcmShellVm

Кроме того, вам нужно переключиться на Image.ToolTip добавить всплывающую подсказку к изображению, как Button.ToolTip не является действительной собственностью для вашего DataTemplate

<Button Command="{Binding ContactCommand}">
    <Button.Resources>
        <DataTemplate DataType="{x:Type CmTypes:TelecomNumberPcmShellVm}">
            <Image Source="{resx:Resx Key=Img_Telephone, ResxName=Presentation.Resources.PartyDetailView}">
                <Image.ToolTip>
                    <TextBlock>
                        <TextBlock.Text>
                            <resx:Resx Key="ContactCommand_Telephone_Tooltip" 
                                       BindingPath="SelectedVm" 
                                       ResxName="Presentation.Resources.PartyDetailView"/>
                        </TextBlock.Text>
                    </TextBlock>
                </Image.ToolTip>
            </Image>
        </DataTemplate>
    </Button.Resources>
</Button>

Если вы действительно хотите установить Button.ToolTip вместо Image.ToolTipтогда вам, вероятно, потребуется установить его в DataTrigger в Button.Style, Обычно для такого сценария у меня есть конвертер, который возвращает typeof(value), Так что мой DataTrigger выглядит примерно так:

<DataTrigger Binding="{Binding Converter={StaticResource ObjectToTypeConverter}}" 
             Value="{x:Type CmTypes:TelecomNumberPcmShellVm}">
    <Setter Property="ToolTip" ... />
</DataTrigger>

Это также может быть использовано для установки Button.ContentTemplate вместо использования неявных шаблонов данных, как показано выше.

Другие вопросы по тегам