我的应用程序是翻译应用程序。它包含一个传递给不同视图模型的翻译列表。这些视图模型可能会修改这些列表,包括添加和删除操作。为此,我将此列表转换ObservableCollection
为构造函数中的 ,并且不再修改我的列表。我知道转换为 anObservableCollection
会创建一个新对象,并且引用不再相同。它对于相关视图非常有效,但是一旦我想更改为另一个视图,列表就不会更新。我想知道解决这个问题的最佳方法是什么?
我想我可以创建一个自定义 ObservableCollection 来包含相应的列表,并在添加或删除操作完成时自动更新它。看起来与此类似的东西。
看法
public partial class MainWindow : Window
{
private void ListViewItem_PreviewMouseDown(objectsender,MouseButtonEventArgs e)
{
// this is where I instanciate the viewModel, and the
// list<Translation> isn't modify once I close the view
DataContext = new ModifyWordVM(translations);
}
}
视图模型
public class ModifyWordVM: INotifyPropertyChanged
{
private ObservableCollection<TranslationVM> translations;
public ObservableCollection<TranslationVM> Translations
{
get { return translations; }
set { translations = value; OnPropertyChanged("Translations"); }
}
public ModifyWordVM(List<Translation> translations)
{
// Converting list to ObservableCollection
Translations = ConvertionHelper.ConvertTo(translations);
}
}
我想知道什么是让修改后的列表更简洁的方法。
您应该封装翻译及其操作。为此,只需引入一个类,例如TranslationService
,在所有相关视图模型之间共享。为了省略臭味单例,我在App.xaml资源中添加了一个服务实例。
这个想法是翻译列表的所有修改都发生在一个位置或类型中。与视图绑定源相同的类型。添加新翻译时,视图应调用ICommand
视图模型上的a 。此命令将调用AddTranslation
的方法TranslationService
。删除也是一样。对翻译集合的任何更改现在都将反映在整个应用程序中。
如果您还想捕捉实际翻译的修改(例如重命名或编辑),则还TranslationService
需要处理项目的PropertyChanged
事件ObservableCollection
。
当 items 属性更改时,TranslationService
必须通过引发PropertyChanged
该ObservableCollection
属性的事件来响应Translations
。这也需要项目来实施INotifyPropertyChanged
。
App.xaml
共享TranslationService
实例
<Application.Resources>
<TranslationService x:Key="TranslationService">
<TranslationService.DatabaseService>
<DatabaseService />
</TranslationService.DatabaseService>
</TranslationService>
</Application.Resources>
主窗口.xaml.cs
public partial class MainWindow : Window
{
private void ListViewItem_PreviewMouseDown(objectsender,MouseButtonEventArgs e)
{
// Instantiate the view model and initialize DataContext from XAML instead.
// This method became redundant.
}
}
主窗口.xaml
<Window.DataContext>
<ModifyWordVM>
<ModifyWordVM.TranslationService>
<!-- Reference the shared instance -->
<StaticResource ResourceKey="TranslationService" />
</ModifyWordVM.TranslationService>
</ModifyWordVM>
</Window.DataContext>
修改WordVM.cs
public class ModifyWordVM: INotifyPropertyChanged
{
public ModifyWordVM()
{}
public AddTranslation(Translation translation) => this.translationService.AddTranslation(translation);
public RemoveTranslation(Translation translation) => this.translationService.RemoveTranslation(translation);
public TranslationService TranslationService {get; set;}
public ObservableCollection<TranslationVM> Translations => this.translationService.Translations;
}
翻译服务.cs
public class TranslationService
{
public TranslationService()
{}
public AddTranslation(Translation translation)
{
// Add translations
}
public RemoveTranslation(Translation translation)
{
// Remove translations
}
private DatabaseService databaseService;
public DatabaseService DatabaseService
{
get => this.databaseService;
set
{
this.databaseService = value;
this.Translations = databaseService.getTranslations;
}
}
private ObservableCollection<TranslationVM> translations;
public ObservableCollection<TranslationVM> Translations
{
get => this.translations;
set
{
this.translations = value;
OnPropertyChanged("Translations");
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句