WPF - привязка к значку меню - PullRequest
3 голосов
/ 31 марта 2009

У меня есть UserControl, который содержит меню. Мне нужно привязать Menu.Icon к свойству UserControl, но оно не работает.

Код начинается так -

        <Border Grid.Row="0">            
        <DockPanel>
            <Image x:Name="testImage" Height="16" Width="16" Source="{Binding ElementName=UC,Path=AddImage}"/>
            <Menu DockPanel.Dock="Left" Height="20"
              VerticalAlignment="Center">
                <MenuItem Header="{Binding ElementName=UC,Path=AddText}">
                    <MenuItem.Icon>
                        <!--<Image x:Name="workswhenin" Height="16" Width="16" Source="pack://application:,,/Kowdox;component/Images/UserIcons/user_add.png"/>-->

                        <Image x:Name="realImage" Height="16" Width="16"
                        Source="{Binding ElementName=UC,Path=AddImage}"/>
                    </MenuItem.Icon>
                </MenuItem>

Первое объявленное вами изображение (testImage) работает отлично, поэтому я рад, что привязка верна. Второе изображение (закомментированное и названное 'workswhenin') содержит URI пакета, который я передаю связанному свойству UserControls, и это тоже работает, но третий (realImage) вообще не появляется!

Я не вижу НИКАКОЙ причины, почему это не должно работать; я знаю, что привязка хорошая, и я знаю, что расположение изображения в разметке хорошее, так что же происходит?

Любая помощь будет принята с благодарностью. Заранее спасибо.

1 Ответ

5 голосов
/ 27 октября 2009

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

Image.Source ожидает объект типа ImageSource. При указании URL-адреса в XAML для преобразования URL-адреса в объект ImageSource используется конвертер WPF по умолчанию. Поскольку вы используете привязку, конвертер по умолчанию не используется. Таким образом, вы, вероятно, пытаетесь установить для источника изображения значение URL вместо ImageSource объекта.

В вашем коде за свойством вам нужно будет создать объект ImageSource, что действительно является проблемой. Вы можете создать BitmapImage и передать URL.

Самое простое решение - использовать стандартный конвертер Microsoft в коде свойства, к которому вы привязываете, или явно использовать его в привязке. Преобразователь называется ImageSourceConverter.

EDIT:

Вот простой пример:

Код внутри источника привязки:

public ImageSource AddImageSource
{
    get
    {
        ImageSourceConverter imgConv = new ImageSourceConverter();
        return imgConv.ConvertFrom(this.AddImage);
    }
}

Обновите привязки для этого свойства вместо свойства AddImage. Убедитесь, что вы запускаете событие PropertyChanged для этого свойства также при изменении свойства AddImage.

Для создания тестового сценария для этого не потребовалось время, но он должен работать без проблем.

...