C# WPF-数据绑定映像源

C# WPF-数据绑定映像源,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,如何将图像控件数据绑定以自动获取player.PlayerImage更新?正如您从我的代码中看到的,我已经尝试设置数据绑定,但是它不起作用 以下是我当前的设置: 我有一个名为CDGPlayer的CLR类,它实现了INotifyPropertyChanged CDGPlayer类有一个名为PlayerImage private Image playerImage; public Image PlayerImage { get { return playerImage; } set

如何将图像控件数据绑定以自动获取player.PlayerImage更新?正如您从我的代码中看到的,我已经尝试设置数据绑定,但是它不起作用

以下是我当前的设置:

我有一个名为
CDGPlayer
的CLR类,它实现了
INotifyPropertyChanged

CDGPlayer
类有一个名为
PlayerImage

private Image playerImage;
public Image PlayerImage
{
    get { return playerImage; }
    set
    {
        if (value != playerImage)
        {
            playerImage = value;
            NotifyPropertyChanged("PlayerImage");
        }
    }
}
我有一个WPF客户端,我想使用CDGPlayer

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CDG="clr-namespace:GoldenKaraokeLib.CDG;assembly=GoldenKaraokeLib" 
    xmlns:local="clr-namespace:GoldenKaraokePlayerWPF" 
    x:Class="GoldenKaraokePlayerWPF.Window1"
    Title="Window1" Height="300" Width="654"
        x:Name="CDGPlayerHost" Loaded="CdgPlayerHostLoaded" Background="#FFCD6F6F">
    <Window.Resources>
        <local:CdgImageConverter x:Key="CDGImageConverter"/>
    </Window.Resources>
    <Grid>
        <Grid.DataContext>
            <CDG:CDGPlayer x:Name="player"/>
        </Grid.DataContext>
        <Border BorderBrush="Black" BorderThickness="5">
            <Image x:Name="CDGImage" Source="{Binding PlayerImage, Converter={StaticResource CDGImageConverter}, UpdateSourceTrigger=PropertyChanged}"/>
        </Border>
    </Grid>
</Window>

我做错了什么?

我尝试时,您的绑定似乎是正确的。不过,看起来您的转换器有一个bug。您不会倒带流,因此BitmapImage将尝试从末尾开始读取,而不是从开头开始读取。添加呼叫至:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    try
    {
        MemoryStream ms = new MemoryStream();
        Image bitmap = value as Image;
        BitmapImage bi = new BitmapImage();

        if (bitmap != null)
        {
            bitmap.Save(ms, ImageFormat.Bmp);

            bi.BeginInit();
            bi.StreamSource = ms;
            bi.EndInit();
        }

        return bi;
    }
    catch
    {
        return new BitmapImage();
    }
}
if (bitmap != null)
{
    bitmap.Save(ms, ImageFormat.Bmp);
    ms.Seek(0, SeekOrigin.Begin); // Set position back to the start of the stream
    bi.BeginInit();
    bi.StreamSource = ms;
    bi.EndInit();
}