ObservableCollection项不绑定到TextBox

时间:2016-02-16 14:15:27

标签: wpf

我对以下情况感到困惑:

我定义了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>

2 个答案:

答案 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 ControlList来绑定此集合而不是堆栈面板。