Изменить шаблон xaml по типу
Ниже приведен фрагмент DataTemplate, который определяет полосы команд (кнопок с изображениями) для связи с клиентами. В настоящее время определены для телефонных контактов, есть еще несколько команд, поэтому я хочу использовать это для других типов методов контакта (электронная почта и т. Д.)
То, как оно разработано и модели представления позади него, есть только две вещи, которые нужно изменить, чтобы сделать это:
- Изображение и всплывающая подсказка для кнопки ContactCommand
- Вся последняя кнопка
Кажется, наиболее подходящим подходом было бы использование всей кнопки в качестве самого 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
вместо использования неявных шаблонов данных, как показано выше.