【问题标题】:Binding an ObservableCollection.Count to Label with WPF使用 WPF 将 ObservableCollection.Count 绑定到标签
【发布时间】:2013-08-10 01:17:25
【问题描述】:

我有一个简单的Label,它应该包含ObservableCollection 的属性的绑定.Count 值。

问题是,结果始终为 0(零)。相同的 Property 绑定到 DataGrid,它可以完美运行,甚至在 Collection 发生变化时更新。

我在这里做错了什么?

这是我的代码:

<Label ContentStringFormat="Members: {0}">
    <Label.Content>
        <Binding Path="MembersList.Count" Mode="OneWay" UpdateSourceTrigger="Default" />
    </Label.Content>
</Label>

属性看起来像:

public static ObservableCollection<Mitglied> MembersList { get; set; }

【问题讨论】:

  • 您是否在数据绑定类上实现 INotifyPropertyChanged?
  • 你是指哪个类?中规中矩?是的,我愿意
  • 试试这个
  • MembersList 属性在哪个类中。为了使绑定起作用,您从外部源加载集合,您需要在类上实现 INotifyPropertyChanged 并在 Set 为时引发 PropertChanged 事件打电话给物业。 msdn.microsoft.com/en-us/library/…
  • 顺便说一句,ObservableCollection&lt;T&gt; 确实实现了 INPC,并且确实为 Count 属性提出了 PropertyChanged

标签: wpf count bind observablecollection zero


【解决方案1】:

我只能假设您实际上并未将任何项目添加到集合中。如果你认为你是,你必须给我们一个更完整的再现。

这对我来说非常适合:

MainWindow.xaml

<Window x:Class="SO18124125.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Button x:Name="addButton">Add</Button>
        <Label>
            <Label.Content>
                <Binding Path="Items.Count" Mode="OneWay" UpdateSourceTrigger="Default"/>
            </Label.Content>
        </Label>
    </StackPanel>
</Window>

MainWindow.xaml.cs

namespace SO18124125
{
    using System.Collections.ObjectModel;
    using System.Windows;

    public partial class MainWindow : Window
    {
        private static readonly ObservableCollection<string> items = new ObservableCollection<string>();

        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = this;

            this.addButton.Click += delegate
            {
                items.Add("foo");
            };
        }

        public static ObservableCollection<string> Items
        {
            get { return items; }
        }
    }
}

顺便说一句,这要简洁得多:

<Label Content="{Binding Items.Count}" ContentStringFormat="Members: {0}"/>

【讨论】:

  • 但它是一个 ObservableCollection。不应该更新吗? UI 初始化后,集合被填充。 Datagrid 自动刷新。标签值保持为 0。
  • 好的。我也这样做了。没有变化。
  • 这实际上就是我一开始正在做的事情。公共 MainWindow() { Var.MembersList = new ObservableCollection(); Var.SchoolList = new ObservableCollection();初始化组件();连接数据库(); Var.MembersList = new ObservableCollection(SQL.selectMitglieder());但这对我不起作用...
【解决方案2】:

你可以试试这个...

MainWindow.Xaml.cs->

int Counter = 0;
private static ObservableCollection<string> _MemberList = new ObservableCollection<string>();
// Suppose it is of String type..I took it as of String type to check my case
public static ObservableCollection<string> MemberList
{
    get { return MainWindow._MemberList; }
    set { MainWindow._MemberList = value; }
}

MainWindow()
{
    InitializeComponent();
    MemberList.Add("0");
    MemberList.Add("1");
    MemberList.Add("2");
    Label1.DataContext = this;
}

private void Button_Click(object sender, RoutedEventArgs e)
{          
    try
    {
        MemberList.RemoveAt(Counter);
        Counter++;
     }
     catch(Exception ex)
     {
         string strTemp=ex.Message();
     }
 }

MainWindow.xaml->

    <Grid>
        <Label Name="Label1" ContentStringFormat="Members: {0}" Margin="0,56,141,38" RenderTransformOrigin="0.158,1.154" HorizontalAlignment="Right" Width="183">
        <Label.Content>
            <Binding Path="MemberList.Count" Mode="OneWay" UpdateSourceTrigger="Default"/>
        </Label.Content>
    </Label>
        <Button Click="Button_Click" Width="100" Height="20" Content="click" Margin="43,169,360,122" />
    </Grid>

【讨论】:

  • 好的。所以你实际上在哪里赖特。我必须在初始化 UI 之前添加项目。不,它可以正常工作并且可以完美更新。谢谢!
【解决方案3】:

您好,您必须在 CollectionChanged 上进行通知,然后它才会起作用

    public class ViewModel: INotifyPropertyChanged
{
    public ObservableCollection<string> MembersList { get; set; }

    public ViewModel()
    {
        MembersList = new ObservableCollection<string>();
        MembersList.CollectionChanged += collection_CollectionChanged;
        MembersList.Add("wfwef");
    }

    void collection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        Notify("MembersList.Count");
    }

    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }


    public event PropertyChangedEventHandler PropertyChanged;
}

DataGrid 使用此 collectionChanged,因此适用于 DataGrid。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多