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);
}
}
}
おかげで、
よろしくすべての迅速な答えに
ViewModels InotifyPropertyの実装はどうですか? – RTDev
申し訳ありませんが、この不足している詳細については、編集しました。 – ArthurCPPCLI
OK、INotifyImplementedを使用していますが、使用していません;)try - private ObservableCollection _commands; public ObservableCollection コマンド{ger {return _commands;} {_commnads = value;}を設定します。 RaisePropertyChanged( "コマンド"); } –
RTDev