WPF - 绑定到菜单图标

Eig*_*ite 4 .net wpf binding menu

我有一个包含菜单的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>
Run Code Online (Sandbox Code Playgroud)

您看到的第一个图像声明(testImage)完美无缺,所以我很高兴绑定是正确的.第二个Image(注释掉并命名为'workswhenin')包含我传递给UserControls绑定属性的包URI,它也可以工作,但第三个(realImage)根本没有出现!

我看不出它为什么不起作用的任何理由; 我知道绑定是好的,我知道图像在标记中的位置是好的,所以发生了什么?

任何帮助将不胜感激.提前致谢.

Jos*_*h G 5

无法确定,因为我看不到你的代码,但我很确定我知道问题是什么.

Image.Source期望一个类型的对象ImageSource.在XAML中指定URL时,将使用默认WPF转换器将URL转换为ImageSource对象.由于您使用的是绑定,因此不使用默认转换器.因此,您可能尝试将图像源设置为URL值而不是ImageSource对象.

在你的代码隐藏属性中,你将不得不创建一个ImageSource对象,这真的很痛苦.您可以创建一个BitmapImage并传入URL.

最简单的解决方案是在您绑定的代码隐藏属性中使用Microsoft的默认转换器,或者在绑定中明确使用它.调用转换器ImageSourceConverter.

编辑:

这是一个简单的例子:

绑定源内的代码:

public ImageSource AddImageSource
{
    get
    {
        ImageSourceConverter imgConv = new ImageSourceConverter();
        return imgConv.ConvertFrom(this.AddImage);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新绑定以定位此属性而不是AddImage属性.确保在AddImage属性更改时也为此属性触发PropertyChanged事件.

没有花时间为此构建测试场景,但它应该没有任何问题.