【问题标题】:WPF Listview not displaying when I add an item添加项目时WPF Listview不显示
【发布时间】:2020-04-24 15:19:50
【问题描述】:

我正在尝试将项目动态添加到 WPF 中的列表视图中,但我不知道为什么显示任何项目。虽然这是一个复习问题,所以我尝试使用一些 ObservableCollection 但它没有用。 我在两个文本块中获取信息,并希望它们在我单击按钮时显示在列表视图中。

你能帮我理解这个问题吗?

我的带有列表视图的 WPF

<ListView Name="listview" Margin="0 10 0 0" Height="150" ItemsSource="{Binding Recette}">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding nomP}" Header="Nom" Width="250"/>
                    <GridViewColumn DisplayMemberBinding="{Binding quantP}" Header="Quantité" Width="100"/>

                </GridView>
            </ListView.View>
</ListView>

我的 .cs :

public List<Produits> Recette { get; set; }
    public AjoutRecette()
    {
        InitializeComponent();
    }

    private void btnAjoutProd_Click(object sender, RoutedEventArgs e)
    {
        string nomP = combobProd.Text;
        int quantP = int.Parse(txtbQuantité.Text);
        Produits prod = new Produits(nomP, quantP);
        Recette.Add(prod);
    }

这是我已经尝试过的 ObersvableCollection :

public ObservableCollection<Produits> Recette { get; set; }
    public AjoutRecette()
    {
        InitializeComponent();
    }

    private void btnAjoutProd_Click(object sender, RoutedEventArgs e)
    {
        Recette = new ObservableCollection<Produits>();
        string nomP = combobProd.Text;
        int quantP = int.Parse(txtbQuantité.Text);
        Produits prod = new Produits(nomP, quantP);
        Recette.Add(prod);
    }

非常感谢!

【问题讨论】:

  • Recette 更改为ObservableCollection&lt;Produits&gt;
  • 嗨,感谢您的帮助,但它仍然无法正常工作,即使使用“public ObservableCollection Recette { get; set; }”也没有发生任何事情
  • 如前所述,使用ObservableCollection。还要确保ListView 具有正确的DatContext,否则绑定将无法解析。
  • 在您的构造函数中,在 InitializeComponment() 调用之后添加 DataContext = this;

标签: c# wpf listview


【解决方案1】:

要使其正常工作,请检查以下几点:

  1. 请将Recette 更改为ObservableCollection&lt;Produits&gt; 类型,而不是List&lt;Produits&gt;。您需要调整属性类型以及实例化集合的代码部分。 你可以这样做:

    public ObservableCollection<Produits> Recette { get; set; } = new ObservableCollection<Produits>();
    
  2. 确保DataContext 属性设置正确。一种方法是在AjoutRecette 的构造函数中设置DataContext

    public AjoutRecette()
    {
        InitializeComponent();
        listview.DataContext = this;
    }
    
  3. 另外,请确保 nomPquantP 属性存在于 Produits 类中。

祝你好运!

【讨论】:

  • 您好,非常感谢您的明确回答!我只是再次尝试用这种实例化集合的方式,但仅此而已。我并没有真正得到“grid.DataContext = this”,我想在哪里设置它?并且类中存在 nomP 和 quantP。
  • 嗨@Matthieu。实际上,我们应该能够在不考虑父元素的情况下使其工作。你能尝试在AjoutRecette的构造函数中调用:listview.DataContext = this;吗?
  • 您应该避免在特定元素上显式设置DataContext。最好将其设置在顶级元素上,例如WindowUserControl 使用 DataContet 继承。出于这个原因,它应该在构造函数中为this.DataContext = this;。这样一来,您也无需为了初始化而使用命名控件。
  • 这是一个很好的观点@BionicCode。展望未来,Matthieu,请考虑研究 MVVM 模式并绑定到 ViewModel 类,而不是绑定到后面的代码。它将很好地将视图层与视图模型(您绑定的东西)分离,并使解决方案在未来更易于维护。快乐编码! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多