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 绑定失败,我发现找不到 ImagePath 和 Name(在 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; }
这些属性是只读的,就像它们替换的字段一样。
我想显示一个列表框,其中包含一个图像和一个字符串作为列表框项。 为此,我将 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 绑定失败,我发现找不到 ImagePath 和 Name(在 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; }
这些属性是只读的,就像它们替换的字段一样。