4

セットアップ: 0...n 個のタブを持つタブ コントロールがあり、各タブはクラスにバインドされています。

class MyTabItem
{
    string Text {get; set;}
    int ID {get; set;}
    ISet<MyTabContent> Contents {get; set;}
}

Class MyTabContent
{
    int ID {get; set;}
    string Subtext {get; set;}
}

各 tabitem クラスには、そのセット内に多くの tabcontent クラスがあります。(全体は NHibernate 経由でフェッチされます)。

MyTabItem のコンテンツを各タブコントロール項目のヘッダーにバインドし、MyTabContent のコンテンツを各タブコントロール項目のコンテンツのデータグリッドにバインドするために多くのことを試みました。

タブにすべてのコンテンツを表示できますが、バインドされたクラスのプロパティを変更しても UI が更新されません。InvalidateVisual を呼び出そうとし、Render イベントを Dispatch しようとし、バインディングで UpdateTarget と UpdateSource を試みました (最後の 2 つは例外をスローしました)。ビューモデルに INotifyPropertyChanged を実装しましたが、手動で OnPropertyChanged("MyTabItem") を使用しても無駄でした。

バインドされたクラスのプロパティを変更すると、タブコントロールの内容が更新されない理由が本当にわかりません。私は2つの異なるバインディング戦略を試しました。どちらもコンテンツの表示には機能しますが、コンテンツが変更されてもどちらも更新されません。

私のXAMLセットアップは次のとおりです。

<TabControl>
  <TabControl.ItemTemplate>
    <DataTemplate DataType="models:MyTabItem">
      <TextBlock Text="{Binding Text}" />
    </DataTemplate>
  </TabControl.ItemTemplate>
  <TabControl.ContentTemplate>
    <DataTemplate DataType="models:MyTabItem">
      <DataGrid ItemsSource="{Binding Contents}">
        <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding Path=Subtext}" />
        </DataGrid.Columns>
      </DataGrid>
    </DataTemplate>
  </TabControl.ContentTemplate>
</TabControl>

その XAML セットアップでは、tabcontrol.Items.Add(new MyTabItem) を使用して項目をタブ コントロールに追加するだけです。

次に、コード ビハインドで tabcontrol.Itemsource を ObservableCollection にバインドする別の XAML セットアップを試しました。繰り返しますが、バインドされたプロパティが変更された場合、タブのコンテンツは更新されませんでした:(

また、ViewModel で CurrentItem プロパティを作成し、それを Window.Resource として使用してから、Tabcontrol の内容を

{Binding Source={StaticResource CurrentItem}, Path=Text}

タブを変更するたびに、ビューモデルの CurrentItem を更新しましたが、それによって変更も更新されませんでした。

私はほとんどアイデアがありません:(

4

1 に答える 1

5

INotifyPropertyChangedを実装する必要があります

.NET 4.5 にはタスクを簡素化する新しい属性があることに注意してください。こちらをご覧ください。

これがサンプルです。これを両方のクラスに適用すると、リストはObservableCollectionになる必要があります。

private ObservableCollection<MyTabContent> _contents = new  ObservableCollection<MyTabContent>();
public ObservableCollection<MyTabContent> Contents { get { return _contents; } }

-

public class MyTabContent : INotifyPropertyChanged
{
    private int _id;
    int ID {
        get{ return _id; }
        set{ _id = value; OnPropertyChanged(); }
    }

    private string _subText;
    public string Subtext {
        get{ return _subText; }
        set{ _subText= value; OnPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    { 
        if (PropertyChanged!= null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
于 2013-03-27T18:21:09.510 に答える