C# 中的绑定 (MVVM + WPF)

Binding in C# (MVVM + WPF)

我想显示一个列表框,其中包含一个图像和一个字符串作为列表框项。 为此,我将 ThemeLayer 列表绑定为 ItemsSource 并定义了一个 ItemTemplate。

XAML

<ListBox x:Name="DataLayerList" SelectionMode="Extended"
         ItemsSource="{Binding LayersFiltered, Mode=OneWay}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Path=ImagePath}" Height="16"/>
                <TextBlock Text="{Binding Path=Name}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

ThemeLayer 定义如下:

C#

public class ThemeLayer
{
    public readonly string Name;
    public readonly string Id;
    public readonly string Type;
    public readonly string ImagePath;
    
    public override string ToString()
    {
        return Name;
    }

    public ThemeLayer(string name, string id, string type, string image)
    {
        Name = name;
        Id = id;
        Type = type;
        ImagePath = image;
    }
}

并且列表 LayersFiltered 包含 ThemeLayer 的对象,类似于:

 new ThemeLayer("Place","eb760ca1bb494d2887c5d8c51ccc417a", "image", "ImageLayer16.png")

当我 运行 我的项目时,我得到的列表框中充满了项目,但我看不到一个项目。我只知道是因为将鼠标悬停在列表上会显示列表框项目的不同行。

查看 XAML 绑定失败,我发现找不到 ImagePathName(在 ItemTemplate 中定义)在 ThemeLayer 类型的对象上,即使 LayersFiltered 中的对象肯定是 ThemeLayer 类型并且每个对象都有一个 属性 名称ImagePath.

ThemeLayer class 和定义 ThemeLayer 列表的 class 都在我的模型文件夹中,并且 LayersFiltered 是我的 ViewModel 中的一个列表对象。

如何定义显示图像和名称的 XAML?

还有一件事:

要在列表框中显示的图像位于项目内的文件夹 Images 中。如上所示,仅通过名称引用图像是否可以,或者是否需要类似于“/Images/filename.png”?

您需要绑定到属性而不是字段。改变这个...

public readonly string Name;
public readonly string Id;
public readonly string Type;
public readonly string ImagePath;

成为

public string Name { get; }
public string Id { get; }
public string Type { get; }
public string ImagePath { get; }

这些属性是只读的,就像它们替换的字段一样。