2016-12-07 7 views
0

UWPプロジェクトでは、1ページ、1つのusercontrol、1つのviewmodelがあります。ObservableCollectionをItemsControlsまたはLisViewにバインドしません。

ページがペインにロードされたユーザーコントロールとSplitViewが含まれています(MyPageViewModelと呼ばれる)ビューモデル:

<SplitView.Pane> 
    <local:MyUserControl /> 
</SplitView.Pane> 

ページとユーザーコントロールの両方が同じのDataContextを持っています。私はリストを作成し、ページのコードビハインドボタンのクリックイベントには

public ObservableCollection<MyModel> Commands { get; set; } 

List<MyModel> ListCommands; 

私はいくつかの件のデータをロードし、その後、私は直接呼び出すViewModelには次のようにオブジェクトののObservableCollectionを持っていますViewModelに同様の方法:

(this.DataContext as MyPageViewModel).Load(listCommands); 

ロードビューモデルで定義された方法であり、それはのObservableCollectionを埋める:

ユーザーコントロールのコードでは、
public void Load(List<MyModel> commands) 
    { 
     Commands = new ObservableCollection<MyModel>(commands); 
    } 

これのObservableCollectionが正常に実行時にロードされますが(ユーザーインターフェースが通知されなかった場合、変更が発生したとして)のItemsControlは、ユーザーコントロールに件のデータを表示しません:

<UserControl.DataContext> 
    <ViewModels:RestaurantDetailsViewModel /> 
</UserControl.DataContext> 

... 

<ItemsControl ItemsSource="{Binding Commands}" 
        Grid.Row="1" /> 

ItemsControlは空のままです(私は、内部のMyModelプロパティを表示するためにDataTemplateを使用します)。私もListViewでテストしましたが、結果は同じです。

注:私のviewmodelはINotifyPropertyChangedのを実装するカスタムクラスから継承:事前に

public class MyPageViewModel : BindabelBase 

public abstract class BindableBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged([CallerMemberName]string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public void Set<T>(ref T storage, T value, [CallerMemberName()]string propertyName = null) 
    { 
     if (!object.Equals(storage, value)) 
     { 
      storage = value; 
      this.RaisePropertyChanged(propertyName); 
     } 
    } 
} 

おかげで、

よろしくすべての迅速な答えに

+1

ViewModels InotifyPropertyの実装はどうですか? – RTDev

+0

申し訳ありませんが、この不足している詳細については、編集しました。 – ArthurCPPCLI

+1

OK、INotifyImplementedを使用していますが、使用していません;)try - private ObservableCollection _commands; public ObservableCollection コマンド{ger {return _commands;} {_commnads = value;}を設定します。 RaisePropertyChanged( "コマンド"); } – RTDev

答えて

0

おかげで、問題が解決されます。

私のエラーは、ViewModelの新しいインスタンスを作成したときに、ページとユーザーコントロールの両方のDataContextを再宣言することでした(=データコンテキストはページとユーザーコントロールの2つのインスタンスで同じではありません)。 CommandesPageは、ページの名前です

<local:MyUserControl DataContext="{Binding DataContext, ElementName=CommandesPage}" /> 

ソリューションは、このようなユーザーコントロールにページのDataContextのを示すためでした。

関連する問題