向ObservableCollection添加元素不会更新UI

时间:2018-04-07 14:26:59

标签: c# wpf data-binding

我想要TabControl动态TabItems。我的代码隐藏文件中有一个ObservableCollection属性,当我向此属性添加元素时,我希望GUI添加一个新的TabItem元素。

MainWindow.xaml

<TabControl ItemsSource="{Binding ElementName=Window, Path=PositionTabs, Mode=OneWay}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header, Mode=OneTime}"></TextBlock>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Content, Mode=OneTime}"></TextBlock>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public ObservableCollection<PositionTab> PositionTabs { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        PositionTabs = new ObservableCollection<PositionTab>();

        for (int i = 0; i <= 4; i++)
        {
            PositionTabs.Add(new PositionTab(i));
        }
    }
}

PositionTab.cs

public class PositionTab
{
    public int PosIndex { get; }
    public string Header => $"Position {PosIndex + 1}";  
    public string Content => "Content";

    public PositionTab(int posIndex)
    {
        PosIndex = posIndex;
    }
}

当我启动我的应用程序时,我只有一个空的TabControl

1 个答案:

答案 0 :(得分:2)

您可以移动数据设置:

    public MainWindow()
    {
        PositionTabs = new ObservableCollection<PositionTab>();

        for (int i = 0; i <= 4; i++)
        {
            PositionTabs.Add(new PositionTab(i));
        }

        InitializeComponent();


    }

您遇到的问题是observablecollection最初为null。 这是大多数mvvm开发人员永远不会发生的事情所以它对我们来说看起来很奇怪。 我通常有一个viewmodel,它会实现inotifypropertychanged,当我设置这样一个集合时,它会提升集合中的属性,并且它只是工作。 要做到这一点,所有代码背后都不是通常的做法......但......表明工作:

public partial class MainWindow : Window,  INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public ObservableCollection<PositionTab> PositionTabs { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        PositionTabs = new ObservableCollection<PositionTab>();
        RaisePropertyChanged("PositionTabs");
        for (int i = 0; i <= 4; i++)
        {
            PositionTabs.Add(new PositionTab(i));
        }

    }
}