Параметр Pass для настраиваемого шаблона

Я редактировал шаблон из флажка, затем добавил в него изображение без определения его свойства "Источник".

Стиль:

<Style x:Key="ImageCheckbox" TargetType="{x:Type CheckBox}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/>
        <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type CheckBox}">
                    <Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill"/>                      
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasContent" Value="true">
                            <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
                            <Setter Property="Padding" Value="4,0,0,0"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>       

Мой вопрос заключается в том, как передать это свойство "Источник" (в XAML) шаблону "ImageCheckBox" в этом коде:

<CheckBox Content="" Margin="0,2,0,0" Name="btTogglePalette" Grid.Row="1" Command="Helpers:UICommands.TogglePalette" 
                              IsChecked="{Binding Path=PaletteStatus, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Center" 
                              Style="{DynamicResource ImageCheckbox}">

Таким образом, изображение покажет переданный параметр.

Спасибо

Ответ 1

Невозможно передать пользовательские параметры в стиль или шаблон. Вы можете получать доступ только к свойствам управляющих или связанных данных. Тем не менее, вы можете злоупотреблять свойством тега checkbox для выполнения этого, но я не на 100%, он будет работать.

Правильный способ сделать это - создать новый настраиваемый элемент управления, полученный из Checkbox, и добавить свойство зависимостей, содержащее ваше изображение (типа ImageSource). Таким образом, из вашего шаблона управления внутри generic.xaml вы можете сделать

<!-- in generic.xaml, inside the ControlTemplate for your ImageCheckbox style -->
<Image Source="{TemplateBinding ImageSource}" />

и где вы создаете свой флажок, вы делаете

<local:ImageCheckbox ImageSource="Resources/MyImage.png" ...etc... />

Ответ 2

Вы можете использовать свойство Tag

<CheckBox Tag="YourImageSource"
          Style="{DynamicResource ImageCheckbox}"/>

И затем привяжите Source Image в Template до Tag

<Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill"
       Source="{Binding RelativeSource={RelativeSource TemplatedParent},
                        Path=Tag}"/>

Однако я предпочел бы использовать Attached Property по ряду причин.

  • Намерение использовать Tag не совсем понятно
  • Возможно, вы используете свойство Tag для чего-то еще.
  • Возможно, вы захотите использовать более одного ImageSource и т.д.

Использование Attached Property точно так же, за исключением того, что вы должны поместить скобки вокруг прикрепленного свойства.

<CheckBox local:ImageSourceExtension.ImageSource="YourImageSource"
          Style="{DynamicResource ImageCheckbox}"/>

В шаблоне

<Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill"
       Source="{Binding RelativeSource={RelativeSource TemplatedParent},
                        Path=(local:ImageSourceExtension.ImageSource)}"/>

И вот прикрепленное свойство ImageSource

public class ImageSourceExtension
{
    public static DependencyProperty ImageSourceProperty =
        DependencyProperty.RegisterAttached("ImageSource",
                                            typeof(ImageSource),
                                            typeof(ImageSourceExtension),
                                            new PropertyMetadata(null));
    public static ImageSource GetImageSource(DependencyObject target)
    {
        return (ImageSource)target.GetValue(ImageSourceProperty);
    }
    public static void SetImageSource(DependencyObject target, ImageSource value)
    {
        target.SetValue(ImageSourceProperty, value);
    }
}

Ответ 3

Вам нужно определить источник в изображении шаблона ImageCheckbox или создать собственный CheckBox, полученный из стандартного CheckBox, добавить свойство зависимости типа ImageSource к пользовательскому CheckBox, определить настраиваемый шаблон с привязкой к свойству Source нового созданного элемента управления.