我对以下情况感到困惑:
我定义了ObservableColletion
:
public ObservableCollection<Model.OSModel> OS { get; private set; }
并在构造函数中实例化它:
public MyOSViewModel() // Constructor
{
OS = new ObservableCollection<Model.OSModel>();
}
将项目添加到集合OS时:
public void OnTabClicked(ListaServicosTab listaServicosTab)
{
OS.Add(listaServicosTab.vm.OS);
OnPropertyChanged("OS");
}
它不绑定TextBox。
但是,如果在方法中实例化集合:
public void OnTabClicked(ListaServicosTab listaServicosTab)
{
OS = new ObservableCollection<Model.OSModel>();
OS.Add(listaServicosTab.vm.OS);
OnPropertyChanged("OS");
}
工作正常。 任何人都可以告诉我为什么会这样?
我的Xaml脚本:
<DockPanel Background="CadetBlue" DataContext="{StaticResource OSData}">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="{Binding Path=Nome}" FontFamily="Calibri" FontSize="20"/>
</StackPanel>
</DockPanel>
答案 0 :(得分:0)
您需要通知ObservableCollection的集合已更改事件。
public ObservableCollection<obj> Notifications
{
get { return _Notifications; }
set
{
_Notifications = value;
NotifyPropertyChanged();
Notifications.CollectionChanged -= Notifications_CollectionChanged;
Notifications.CollectionChanged += Notifications_CollectionChanged;
}
}
}
void Notifications_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//Notify
}
<强> MSDN 强>
ObservableCollection表示一个动态数据集合,它在添加,删除项目或刷新整个列表时提供通知。
答案 1 :(得分:0)
您根本不需要OnPropertyChanged("OS");
而不是替换OS对象,而只是添加或删除内容。
List和Observable集合之间的区别在于OS.Add()
将触发集合中“item”的OnPropertyChanged。在列表中,它不会发生。这就是为什么我们使用一个可以为你完成所有工作的可观察集合。
public void OnTabClicked(ListaServicosTab listaServicosTab)
{
OS = new ObservableCollection<Model.OSModel>();// Dont do this
OS.Add(listaServicosTab.vm.OS);
OnPropertyChanged("OS");// Dont do this
}
每次点击你都会替换可观察的集合。你最终只会有一个对象。
public MyOSViewModel() // Constructor
{
OS = new ObservableCollection<Model.OSModel>();
// should initialize only in constructor
//not in a place it will be called multiple times
}
public void OnTabClicked(ListaServicosTab listaServicosTab)
{
OS.Add(listaServicosTab.vm.OS);
}
在XAML中,您应该有Items Control
或List
来绑定此集合而不是堆栈面板。