WPF — привязка к значку меню

У меня есть 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) вообще не отображается!

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

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


person EightyOne Unite    schedule 31.03.2009    source источник


Ответы (1)


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

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

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

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

ИЗМЕНИТЬ:

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

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

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

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

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

person Josh G    schedule 27.10.2009
comment
Этот вопрос только что был просмотрен в 1000-й раз, и все же ваш (полезный и правильный) ответ получил только один голос "за"... от меня! Люди действительно должны использовать свои голоса больше, если они находят ответы полезными. - person EightyOne Unite; 23.11.2010