将ObservableCollection.Count绑定到WPF标签
我有一个简单的将ObservableCollection.Count绑定到WPF标签,wpf,count,bind,observablecollection,zero,Wpf,Count,Bind,Observablecollection,Zero,我有一个简单的标签,它应该包括可观察集合属性的绑定.Count值 问题是,结果总是0(零)。相同的属性绑定到DataGrid,DataGrid可以完美地工作,甚至在集合中发生更改时更新 我做错了什么 这是我的密码: <Label ContentStringFormat="Members: {0}"> <Label.Content> <Binding Path="MembersList.Count" Mode="OneWay" UpdateSo
标签
,它应该包括可观察集合
属性的绑定.Count
值
问题是,结果总是0(零)。相同的属性绑定到DataGrid,DataGrid可以完美地工作,甚至在集合中发生更改时更新
我做错了什么
这是我的密码:
<Label ContentStringFormat="Members: {0}">
<Label.Content>
<Binding Path="MembersList.Count" Mode="OneWay" UpdateSourceTrigger="Default" />
</Label.Content>
</Label>
该属性看起来像:
public static ObservableCollection<Mitglied> MembersList { get; set; }
公共静态ObservableCollection成员列表{get;set;}
我只能假设您实际上没有向收藏中添加任何项目。如果你认为你是,你就得给我们一个更完整的报告
这对我来说非常有效:
main window.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; }
}
}
}
名称空间SO18124125
{
使用System.Collections.ObjectModel;
使用System.Windows;
公共部分类主窗口:窗口
{
私有静态只读ObservableCollection项=新ObservableCollection();
公共主窗口()
{
初始化组件();
this.DataContext=this;
this.addButton.Click+=委托
{
项目。添加(“foo”);
};
}
公共静态可观测集合项
{
获取{返回项;}
}
}
}
顺便说一句,这要简洁得多:
<Label Content="{Binding Items.Count}" ContentStringFormat="Members: {0}"/>
你可以试试这个
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();
}
}
int计数器=0;
私有静态ObservableCollection_MemberList=新ObservableCollection();
//假设它是字符串类型。我把它当作字符串类型来检查我的案例
公共静态ObservableCollection成员列表
{
获取{返回主窗口。_MemberList;}
设置{MainWindow.\u MemberList=value;}
}
主窗口()
{
初始化组件();
成员名单。添加(“0”);
成员名单。添加(“1”);
成员名单。添加(“2”);
Label1.DataContext=这个;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
尝试
{
会员名单。移除(柜台);
计数器++;
}
捕获(例外情况除外)
{
字符串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>
您好,您必须在收集更改时通知,然后它才能工作
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;
}
公共类视图模型:INotifyPropertyChanged
{
公共ObservableCollection成员列表{get;set;}
公共视图模型()
{
MembersList=新的ObservableCollection();
MembersList.CollectionChanged+=集合\u CollectionChanged;
成员名单添加(“wfwef”);
}
无效集合\u集合已更改(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
通知(“会员名单计数”);
}
私有void Notify(字符串propName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新PropertyChangedEventArgs(propName));
}
公共事件属性更改事件处理程序属性更改;
}
DataGrid使用此collectionChanged,因此适用于DataGrid。您是否在数据绑定类上实现INotifyPropertyChanged?您指的是哪个类?米格利德?是的,无论MembersList属性在哪个类中,我都会这样做。为了使绑定能够工作,您正在从外部源加载集合,需要在类上实现INotifyPropertyChanged,并在对属性调用集合时引发PropertChanged事件。顺便说一句,
observedcollection
确实实现了INPC,并且为Count
属性提高了PropertyChanged
。但它是一个observedcollection。它不应该更新吗?UI初始化后,集合将被填充。Datagrid自动刷新。标签值保持为0.0。确定。我也这么做了。没有变化,我一开始就是这么做的。公共主窗口(){Var.MembersList=new ObservableCollection();Var.SchoolList=new ObservableCollection();InitializeComponent();ConnectToDataBase();Var.MembersList=new ObservableCollection(SQL.selectMitglieder());}但这对我不起作用…好吧。你知道赖特在哪里。我必须在初始化UI之前添加这些项。不,它工作正常,更新完美。非常感谢。