【问题标题】:XAML ListView BindingXAML 列表视图绑定
【发布时间】:2016-10-27 19:13:56
【问题描述】:

我在使用 XAML 语法时遇到了一些问题,我无法理解我做错了什么。

我有一个带有 ListView 控件的简单窗口,以及一个带有 ObservableColletion 项目的简单 ViewModel。

Window 的 DataContext 设置正确,但我的问题是 ListView 的 ItemsSource 属性,当我调试应用程序时,我可以看到 ListView 具有 DataContext 权限,并且 DataContext 有一个包含 Items 的列表。

但是属性 ItemsSource 是 null,如果我在它后面的代码中设置它就可以了。

我已经搜索了一个答案,但我找不到答案,有些帖子似乎有同样的问题,但它始终是数据上下文。

这是我的代码。

XAML

<Window x:Class="XAMLExamples.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:XAMLExamples"
        xmlns:vm="clr-namespace:XAMLExamples.ViewModels"
        mc:Ignorable="d"
        Title="Ejemplos XAML" Height="350" Width="525" Background="#FF38551F" WindowStyle="ToolWindow"
         >
    <Window.DataContext>
        <vm:TractoViewModel/>
    </Window.DataContext>

    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto">
            </RowDefinition>
        </Grid.RowDefinitions>
        <ListView ItemsSource="{Binding Path=listaAreas}" Grid.Column="0" x:Name="ListAreas">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Area" Width="120" DisplayMemberBinding="{Binding Area}"/>
                    <GridViewColumn Header="Contenedores" Width="120" DisplayMemberBinding="{Binding Contenedores}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

C#

namespace XAMLExamples.ViewModels
{
    public class TractoViewModel 
    {
        public ObservableCollection<TractoModel> listaAreas = new ObservableCollection<TractoModel>();
        public TractoViewModel()
        {
            for (int i = 0; i < 10; i++)
            {
                listaAreas.Add(
                    new TractoModel { Area= string.Format("Area {0}",i), Contenedores=i}
                    );
            }
            return;
        }
    }
}
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // With the following line everything is right
            // this.ListAreas.ItemsSource = new XAMLExamples.ViewModels.TractoViewModel().listaAreas;
            // Without the above line ItemsSource is null, even when the DataContext is right
            var iSource = ListAreas.ItemsSource;
            if (iSource == null) return;

        }
    }

【问题讨论】:

  • 向我们展示listaAreas的结构。它不仅与 how-to-bind 有关,而且与 what-to-bind 有关。
  • 我无法在主窗口中看到您的数据上下文 hits.DataContext = new TractoViewModel();

标签: c# wpf xaml listview data-binding


【解决方案1】:

WPF 中的数据绑定适用于公共属性,而不是字段。

因此,您必须将 listaAreas 字段更改为属性,例如像这样:

public class TractoViewModel 
{
    public ObservableCollection<TractoModel> listaAreas { get; private set; }
        = new ObservableCollection<TractoModel>();

    ...
}

根据广泛接受的 C# 命名约定,属性名称也应以大写字母开头:

public ObservableCollection<TractoModel> ListaAreas { get; private set; }

【讨论】:

  • 更改集合名称时,别忘了在 XAML 中也进行更改;)
  • 你是绝对正确的,我的问题是我有一个字段而不是一个属性,我只是将这一行改为: public ObservableCollection ListaAreas { get;放; } = 新的 ObservableCollection();现在我什至可以在设计器中看到列表。我真的很感谢你的帮助,它真的告诉我,我必须考虑基础知识以及事情应该如何工作,而不是认为其他事情是错误的。还要感谢@SeeuD1 @C4u
  • 如果回答有帮助,请考虑接受。请参阅帮助中心页面What should I do when someone answers my question?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
相关资源
最近更新 更多