4

ここにいくつかのXAMLがあります

<HierarchicalDataTemplate DataType="{x:Type data:FolderEntity}" 
  ItemsSource="{Binding Path=FolderEntities,UpdateSourceTrigger=PropertyChanged}">
  <Label Content="{Binding FolderName}"/>
</HierarchicalDataTemplate>
<TreeView/>

data:FolderEntity は、INotifyPropertyChanging および INotifyPropertyChanged インターフェイスを実装する LINQ to SQL データ クラスです。

私の問題は、FolderEntities プロパティを変更してもバインディングが更新されないことです。FolderName プロパティを変更すると、その項目に対応するツリー ノードは変更されますが、FolderEntities であるコレクションは変更されません。

コレクション参照が変更されたかどうかをWPFがチェックしていると思いますか、それともItemsSourceオブジェクトがObservableCollection`1である必要がありますか?

この問題に関するご意見をお待ちしております。

4

3 に答える 3

3

はい、基になるコレクション (FolderEntities) はObservableCollection<T>、HierarchicalDataTemplate が変更を通知されるようにする必要があります。それまたはINotifyCollectionChangedを実装するコレクションのいずれかです。

于 2008-12-29T23:51:20.050 に答える
2

これが私がそれを機能させた方法です、ありがとうマット!

public abstract class ObservableHierarchy<T>
{
    public T Current { get; set; }

    public ObservableCollection<ObservableHierarchy<T>> Children { get; set; }

    public ObservableHierarchy( T current, Func<T, IEnumerable<T>> expand )
    {
        this.Current = current;
        this.Children = new ObservableCollection<ObservableHierarchy<T>>();
        foreach ( var item in expand( current ) )
        {
            Children.Add( Create( item ) );
        }
    }

    protected abstract ObservableHierarchy<T> Create( T item );
}

次に、その基本クラスを現在使用しているデータ クラスに特化します。

public class ObservableFolderHierarchy:
    ObservableHierarchy<FolderEntity>
{
    public ObservableFolderHierarchy( FolderEntity root )
        : base( root, x => x.FolderEntities )
    {
    }

    protected override ObservableHierarchy<FolderEntity> Create( FolderEntity item )
    {
        return new ObservableFolderHierarchy( item );
    }
}

XAML を少し変更しただけで、うまく機能します。Current のコレクションまたはプロパティを変更すると、それに応じて TreeView が更新されます。

<HierarchicalDataTemplate DataType="{x:Type ui:ObservableFolderHierarchy}"
 ItemsSource="{Binding Children}">
 <StackPanel Orientation="Horizontal">
  <Image Source="/UI/Resources/folder.png" Width="16" Height="16"/>
  <TextBlock Text="{Binding Current.FolderName}"/>
 </StackPanel>
</HierarchicalDataTemplate>
于 2008-12-30T10:42:53.870 に答える
0

マットは正しいです。データ バインディング エンジンがコレクション内の変更を通知されるようにするには、ObservableCollection にバインドする必要があります。

あなたがバインドしていたのはプロパティであり、PropertyChanged (INotifyPropertyChanged から) は、プロパティが設定されているときにのみ呼び出されていました。たとえばFolderEntities = aNewValue;、バインディング エンジンはコレクション内で発生した変更を認識していませんでした。

于 2008-12-30T01:16:50.550 に答える