2016-06-20 9 views
0

ObservableCollectionにバインドした単純なTreeviewを作成します。ObservableCollectionソースを持つTreeView、更新なし

ObservableCollection<IMarketDataViewModel> MarketDataItems; 

public interface IMarketDataViewModel 
{ 
    string Title { get; } 
    ObservableCollection<IMarketDataViewModel> Items { get; set; } 
} 

public MarketDataUserControl(IMarketDataViewer viewModel) 
{ 
    InitializeComponent(); 
    DataContext = viewModel; 
    marketDataTreeView.ItemsSource = viewModel.MarketDataItems; 
} 

私のViewModelでデータを更新すると、ツリービューの最初のレベルしか表示されません。私はこの問題を解決するために見つけた唯一の方法は、私のViewModelにイベントを作成することで、データが代わりにMarketDataItems上にPropertyChangeを呼び出して更新されたとき、私はイベントをトリガし、表示は次のようにmarketDataTreeView.ItemsSourceをリセットします。

private void ViewModelOnOnUpdateItems() 
{ 
    marketDataTreeView.ItemsSource = null; 
    marketDataTreeView.ItemsSource = viewModel.MarketDataItems; 
} 

そして、この作業は完全に - >すべてのレベルが表示されます。

誰かが、PropertyChangeが機能しない理由とItemsSourceをリセットする必要がある理由を知っていますか?

+0

プロパティでバインディングを実行する必要があります。 –

答えて

0

最後の問題は、私は「didnのことですOnPropertyChanged( "Items")

public class MarketDataViewModelBase : IMarketDataViewModel, INotifyPropertyChanged 
{ 
    ..... 

    private ObservableCollection<IMarketDataViewModel> items; 

    public ObservableCollection<IMarketDataViewModel> Items 
    { 
     get { return items; } 
     set 
     { 
      items = value; 
      OnPropertyChanged("Items"); //Add this line fix my issue 
     } 
    } 
} 
+0

ObservableCollectionプロパティを取得専用にすることをお勧めします。 'readonly'フィールドに基づいています。 –

+0

ありがとう、私はあなたの助言に従います。しかし、ツリーとしての私の問題では、最初はルートノードだけがItems empty/nullで存在し、すべてのノードはrootとのバインディングが完了した後に作成されます – Che

0

は、私はあなたがItemSourceへの結合を実施すべきだと思うと、このプロパティによって行われます:

// Create property 
public ObservableCollection<IMarketDataViewModel> MarketDataItems { get; private set; } 
... 

// Create Binding 
Binding bindingObject = new Binding("MarketDataItems"); 
bindingObject.Source = this; //codebehind class instance which has MarketDataItems 
marketDataTreeView.SetBinding(TreeView.ItemsSource, bindingObject); 

またはXAMLでバインディング:

<TreeView x:Name="marketDataTreeView" ItemsSource="{Binding Path=MarketDataItems}"/> 
+0

この提案をありがとう。問題は、私がOnPropertyChanged( "Items")を呼び出さなかったことです。 – Che

+0

@MohamedCHEROUATIはい、それもプロパティでなければなりません;) –

関連する問題