0

私はこのようなWPFTabControlを持っています:

XAML:

<TabControl Name="myTabControl" ItemsSource="{Binding Main.TabItems, UpdateSourceTrigger=PropertyChanged}" />

次に、実行時にTabItemを追加します。これが私のモデルです。

C#:

class Model() : INotifyPropertyChanged
{
    private List<TabItem> _tabitems = new List<TabItem>();

    public Model()
    {
        TabItem myItem = new TabItem();
        myItem.Header = "test";
        myItem.Content = "test";
        _tabitems.Add(myItem);
        TabItems = _tabitems;
    } 

    public List<TabItem> TabItems
    {
        get
        {
            return _tabitems;
        }
        set
        {
            _tabitems = value;
            OnPropertyChanged("TabItems");
        }
    }

    public bool Execute()
    {
        TabItem myItem = new TabItem();
        myItem.Header = "test";
        myItem.Content = test;
        _tabitems.Add(myItem);
        TabItems = _tabitems;

        return true;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

プログラムを開始すると、コンストラクターのコードはうまく機能します。TabControlに1つのTabItemがあります。しかし、コマンドから関数Exec​​ute()を実行しても、何も起こりません。コンストラクターからタブアイテムを追加できるという問題をどのように解決できますか。コンストラクターで関数を開始すると、機能します。

4

1 に答える 1

1

あなたXamlが新しいものを追加したことを知らないからですTabItem

に変更するList<T>ObservableCollection<T>、ObservableCollection はコレクションへの変更 (追加、削除など) を UI に通知します。

例:

class Model : INotifyPropertyChanged
{
    private ObservableCollection<TabItem> _tabitems = new ObservableCollection<TabItem>();

    public Model()
    {
        TabItem myItem = new TabItem();
        myItem.Header = "test";
        myItem.Content = "test";
        TabItems.Add(myItem);
    } 

    public ObservableCollection<TabItem> TabItems
    {
        get
        {
            return _tabitems;
        }
        set
        {
            _tabitems = value;
            OnPropertyChanged("TabItems");
        }
    }

    public bool Execute()
    {
        TabItem myItem = new TabItem();
        myItem.Header = "test";
        myItem.Content = test;
        TabItems.Add(myItem);

        return true;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
于 2013-02-19T07:46:54.897 に答える