You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 3中ListView绑定含Canvas的ObservableCollection不显示名称

问题解决:WinUI 3 ListView 无法显示 Canvas 名称

你的核心问题是数据绑定路径错误:ListView的ItemsSource是ObservableCollection<Canvas>,每个列表项的DataContext就是单个Canvas对象,不需要额外添加Canvas.前缀来指定路径。

修改后的XAML代码

<StackPanel Grid.Row="1" Orientation="Vertical">
    <ListView x:FieldModifier="public" x:Name="listViewCanvases" Background="SeaGreen" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackPanel>

进阶优化建议

虽然直接绑定Canvas的Name属性可以解决当前问题,但UI控件本身并不适合作为数据绑定的数据源。如果后续需要支持属性变更通知或更复杂的业务逻辑,建议封装一个ViewModel类来承载Canvas的信息:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class CanvasViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

对应修改集合与绑定逻辑:

ObservableCollection<CanvasViewModel> ocCanvases = new ObservableCollection<CanvasViewModel>();
ocCanvases.Add(new CanvasViewModel(){Name="AAA"});
ocCanvases.Add(new CanvasViewModel() { Name = "BBB" });
ocCanvases.Add(new CanvasViewModel() { Name = "CCC" });
listViewCanvases.ItemsSource = ocCanvases;

这种方式符合MVVM设计模式,能更灵活地应对后续功能扩展。

内容的提问来源于stack exchange,提问作者mustapha chaibi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:15:38