Проблема с привязкой свойства зависимости источника изображения

Я создал настраиваемый элемент управления для ImageButton как

<Style TargetType="{x:Type Button}">
     <Setter Property="Template">
           <Setter.Value>
              <ControlTemplate TargetType="{x:Type Local:ImageButton}">
               <StackPanel Height="Auto" Orientation="Horizontal">
                 <Image Margin="0,0,3,0" Source="{Binding ImageSource}" />
                 <TextBlock Text="{TemplateBinding Content}" /> 
               </StackPanel>
              </ControlTemplate>
           </Setter.Value>
     </Setter>
</Style>

Класс ImageButton выглядит так

public class ImageButton : Button
    {
        public ImageButton() : base() { }

        public ImageSource ImageSource
        {
            get { return base.GetValue(ImageSourceProperty) as ImageSource; }
            set { base.SetValue(ImageSourceProperty, value); }
        }
        public static readonly DependencyProperty ImageSourceProperty =
          DependencyProperty.Register("Source", typeof(ImageSource), typeof(ImageButton));
    }

Однако я не могу привязать ImageSource к изображению как: (этот код находится в папке пользовательского интерфейса, а изображение находится в папке ресурсов)

  <Local:ImageButton x:Name="buttonBrowse1" Width="100" Margin="10,0,10,0"
 Content="Browse ..." ImageSource="../Resources/BrowseFolder.bmp"/>

Но если я возьму простое изображение, оно будет отображаться, если указан тот же источник. Может ли кто-нибудь сказать мне, что делать?


person Archie    schedule 28.04.2010    source источник


Ответы (1)


Вам нужно заменить Binding в вашем ControlTemplate на TemplateBinding, как вы это сделали для свойства Content:

<Image Margin="0,0,3,0" Source="{TemplateBinding ImageSource}" />

Кроме того, определение вашего DependencyProperty неверно. Строка должна читаться как ImageSource, а не просто как Source:

DependencyProperty.Register("ImageSource", typeof(ImageSource), ...

Я не знаю, вызывает ли и где этот конфликт имен какие-либо проблемы, но, по крайней мере, настоятельно рекомендуется использовать точное имя фактического свойства CLR.

EDIT: вам также придется изменить TargetType вашего стиля на ImageButton:

<Style TargetType="{x:Type Local:ImageButton}">
person gehho    schedule 28.04.2010
comment
конфликт имен ДЕЙСТВИТЕЛЬНО вызывает проблемы. - person Rob Fonseca-Ensor; 28.04.2010
comment
Замена Binding на TemplateBinding приводит к ошибке времени компиляции, поскольку не удалось создать экземпляр типа «TemplateBindingExtension». - person Archie; 28.04.2010
comment
но я должен сохранить внешний вид ImageButton таким же, как и исходная кнопка. как еще я могу это сделать? - person Archie; 28.04.2010
comment
Я не знаю, является ли это вариантом, но вы можете сделать шаблон вашего ImageButton состоящим из кнопки с ее свойством Content, установленным на текущее содержимое вашего ControlTemplate, например так: <Button><Button.Content><StackPanel>...</StackPanel></Button.Content></Button>. В качестве другого варианта вы можете взглянуть на Style. На основе свойства. - person gehho; 28.04.2010
comment
Я попытался заменить шаблон на контент, простую замену строки. Вы это имели в виду? но на этот раз он не показывал изображение. - person Archie; 28.04.2010
comment
Нет, это не то, что я имел в виду. Я имел в виду это: <ControlTemplate TargetType="{x:Type Local:ImageButton}"><Button><Button.Content><StackPanel ...><Image .../><TextBlock.../></StackPanel></Button.Content></Button></ControlTemplate> Однако не знаю, сработает ли это. - person gehho; 28.04.2010