我用棱鏡。資料提供程式正常作業(此處為 SQLite)。
<ListBox ItemsSource="{Binding Path=CategoryList}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
public class ListsViewModel : BindableBase
{
private readonly IDataProvider _dataProvider;
private readonly IRegionManager _regionManager;
public DelegateCommand ClickAddCategory { get; set; }
private string categoryName;
public string CategoryName
{
get { return categoryName; }
set { SetProperty(ref categoryName, value); }
}
private ObservableCollection<ExtraCategory> categoryList;
public ObservableCollection<ExtraCategory> CategoryList
{
get
{
if (categoryList == null) return _dataProvider.GetCategoryList();
else return categoryList;
}
set { SetProperty(ref categoryList, value); }
}
public ListsViewModel(IRegionManager regionManager, IDataProvider dataProvider)
{
_dataProvider = dataProvider;
_regionManager = regionManager;
ClickAddCategory = new DelegateCommand(ClickedAddCategory);
//MessageBox.Show("Hello from " this.ToString());
}
private void ClickedAddCategory()
{
ExtraCategory newCategoryFromForm = new ExtraCategory(CategoryName);
CategoryList.Add(newCategoryFromForm);
_dataProvider.AddCategory(newCategoryFromForm);
}
}
如果我換行:
CategoryList.Add(newCategoryFromForm);
至
CategoryList = _dataProvider.GetCategoryList();
一切都會正常作業,因為 set {} 中的代碼會運行,但這不是解決方案。我真的很感激一些幫助。另外我真的不想打破 MVVM 模式。
uj5u.com熱心網友回復:
您想ObservableCollection在沒有 setter 的情況下放入屬性。并且您希望價值保持不變。
private ObservableCollection<ExtraCategory> categoryList;
public ObservableCollection<ExtraCategory> CategoryList
{
get
{
if (categoryList == null) return _dataProvider.GetCategoryList();
else return categoryList;
}
set { SetProperty(ref categoryList, value); }
}
ObservableCollection每次呼叫時都會為您提供一個新的CategoryList.get,即CategoryList.Add(newCategoryFromForm);獲取一個新串列,添加新專案,然后丟棄該串列(從屬性的 getter 回傳值不會神奇地設定支持欄位)。
我會這樣做:
public ObservableCollection<ExtraCategory> CategoryList { get; }
在建構式中:
CategoryList = _dataProvider.GetCategoryList();
uj5u.com熱心網友回復:
使用并安裝 nuget 包PropertyChange.Fody。
您的課程將如下所示:
public class ListsViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly IDataProvider _dataProvider;
private readonly IRegionManager _regionManager;
public DelegateCommand ClickAddCategory { get; set; }
public string CategoryName { get; set; }
public ObservableCollection<ExtraCategory> CategoryList { get; set; }
public ListsViewModel(IRegionManager regionManager, IDataProvider dataProvider)
{
_dataProvider = dataProvider;
_regionManager = regionManager;
ClickAddCategory = new DelegateCommand(ClickedAddCategory);
CategoryList = _dataProvider.GetCategoryList();
//MessageBox.Show("Hello from " this.ToString());
}
private void ClickedAddCategory()
{
ExtraCategory newCategoryFromForm = new ExtraCategory(CategoryName);
CategoryList.Add(newCategoryFromForm);
_dataProvider.AddCategory(newCategoryFromForm);
}
}
我相信它會完美地作業
如果您想要更新串列,請使用方法并系結命令以在您想要重繪 時執行
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494730.html
