【问题标题】:TextBlock not showing up in ListViewTextBlock 未显示在 ListView 中
【发布时间】:2019-11-14 17:43:59
【问题描述】:

这是我的列表视图:

<ListView ItemsSource="{Binding ModuleList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <!--<Image Source="{Binding ModuleImage}" Stretch="UniformToFill"/>-->
                <TextBlock Text="{Binding ModuleName}"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这是 WPF (MVVM) 中的代码:

public ItemListViewVM() : base()
{
    ModuleList = new List<Module>();

    modulLoader.LoadAllModules();
    tempModulList = modulLoader.GetAllModules();

    foreach (var module in tempModulList)
    {
        ModuleImage = module.ModuleImage;
        ModuleName = module.Name;
        ModuleList.Add(module);
    }
}

长话短说:列表tempModulList 包含Module 类型的对象,它有一个ImageSource Image 和一个字符串Name。然后 ModuleList 得到一个接一个的项目。当我在 xaml 中取消注释图像时,您可以看到它。但是 TextBlock 无论如何都不会出现。我检查了每个项目的字符串module.Name,它不为空。

编辑:添加模块类 模块类只包含名称和图像:

public class Module
{
    public ImageSource ModuleImage { get; set; }
    public string Name { get; set; }
}

对象是通过反序列化 Json 来创建的

【问题讨论】:

  • Control的DataContext设置是否正确?
  • 是这个:&lt;Grid.DataContext&gt; &lt;vm:ItemListViewVM/&gt; &lt;/Grid.DataContext&gt;
  • 您当然也应该显示 Module 类的声明。除此之外,ItemListViewVM 构造函数中的 foreach 循环似乎毫无意义。 ModuleImage 和 ModuleName 属性或字段的用途是什么?你为什么不直接拥有ModuleList = modulLoader.GetAllModules();
  • 因为我希望 ModuleImageModuleName 显示在列表中。如果我只是做ModuleList = modulLoader.GetAllModules(); 它什么也没显示,因为ModuleImageModuleName 都没有设置
  • 当然,这是Module 中的两个属性。循环内的属性或变量是什么? IE。 ModuleImage = module.ModuleImage;ModuleName = module.Name;?

标签: c# wpf listview mvvm


【解决方案1】:

ItemTemplate 中的绑定使用数据项类的属性作为其源属性。因此你应该写

Text="{Binding Name}"

而不是

Text="{Binding ModuleName}"

除非您设置 ListView 的 View 属性(例如 GridView),否则您还可以更好地使用 ListBox,它是 ListView 的基类,并且更简单:

<ListBox ItemsSource="{Binding ModuleList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding ModuleImage}"/>
                <TextBlock Text="{Binding Name}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

在视图模型构造函数中初始化ModuleList 属性就像这样简单:

public ItemListViewVM()
{
    modulLoader.LoadAllModules();
    ModuleList = modulLoader.GetAllModules();
}

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多