在UWP項目中,我有:1頁,1個usercontrol和1個viewmodel。將ObservableCollection綁定到ItemsControls或LisView不起作用
的頁包含在窗格加載的用戶控制一個SPLITVIEW:
<SplitView.Pane>
<local:MyUserControl />
</SplitView.Pane>
兩個頁和用戶控制具有相同的datacontext:視圖模型(稱爲MyPageViewModel)。該視圖模型對象有像一個ObservableCollection:
public ObservableCollection<MyModel> Commands { get; set; }
在頁面上的一個按鈕單擊事件代碼隱藏,我創建了一個清單:
List<MyModel> ListCommands;
如果我加載某些DATAS,然後我直接調用從視圖模型的方法,如:
(this.DataContext as MyPageViewModel).Load(listCommands);
負載是在視圖模型中定義的方法,它填補了的ObservableCollection:
public void Load(List<MyModel> commands)
{
Commands = new ObservableCollection<MyModel>(commands);
}
此的ObservableCollection成功加載在運行時,但在ItemsControl的用戶控制不顯示DATAS(如同沒有通知的用戶界面的變化發生),在用戶控制代碼:
<UserControl.DataContext>
<ViewModels:RestaurantDetailsViewModel />
</UserControl.DataContext>
...
<ItemsControl ItemsSource="{Binding Commands}"
Grid.Row="1" />
ItemsControl保持爲空(我使用DataTemplate顯示內部MyModel屬性)。我也測試了一個ListView,但結果是一樣的。
注:我的視圖模型從執行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,但沒有使用;)嘗試 - 私人ObservableCollection _commands;公共ObservableCollection 命令{ger {return _commands;} set {_commnads = value; RaisePropertyChanged( 「命令」); } –
RTDev