将集合引用从视图传递到 VM 时跟踪集合引用的最佳方法是什么

格雷戈里

我的应用程序是翻译应用程序。它包含一个传递给不同视图模型的翻译列表。这些视图模型可能会修改这些列表,包括添加和删除操作。为此,我将此列表转换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必须通过引发PropertyChangedObservableCollection属性事件来响应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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将图像从集合视图传递到集合视图

来自分类Dev

将Backbone模型从集合传递到新视图将集合保存在内存中

来自分类Dev

Java:迭代集合的最佳方法是什么?

来自分类Dev

从Windows共享文件到Boot2docker VM的最佳方法是什么?

来自分类Dev

如何将数据从集合视图传递到表视图类?

来自分类Dev

使用委托将数据从集合视图控制器传递到视图控制器

来自分类Dev

无法将数据从集合视图传递到 Xcode 中的详细信息视图

来自分类Dev

使用反向引用的最佳方法是什么?

来自分类Dev

引用Akka演员的最佳方法是什么

来自分类Dev

引用 vm 文件时出现 Impex 错误

来自分类Dev

Backbone.js-将变量从路由传递到视图/集合/模型

来自分类Dev

将列表集合绑定到列表视图

来自分类Dev

减少和合并对象集合的最佳方法是什么

来自分类Dev

就速度而言,过滤Java集合的最佳方法是什么?

来自分类Dev

集合视图是什么?

来自分类Dev

类在类属性中引用自身的最佳方法是什么?

来自分类Dev

引用核心数据实体的最佳方法是什么?

来自分类Dev

选择与大型集合匹配时基于位掩码排除项的一组特征的最佳方法是什么?

来自分类Dev

选择与大型集合匹配时基于位掩码排除项的一组特征的最佳方法是什么?

来自分类Dev

使用KVM将脚本传递到VM

来自分类Dev

创建对采用自我的方法的引用的集合的惯用方式是什么?

来自分类Dev

将引用传递给道具的正确方法是什么?

来自分类Dev

如何将数据传递到导航控制器中嵌入的集合视图控制器

来自分类Dev

使用vm而不是$ scope的引用指令属性

来自分类Dev

使用vm而不是$ scope的引用指令属性

来自分类Dev

为什么将集合绑定到数据网格会导致不同的集合视图?

来自分类Dev

无法通过ViewComposer将集合传递给视图

来自分类Dev

将数据从多个表/一个数据库传递到视图的最佳方法是什么?

来自分类Dev

将数据从多个表/一个数据库传递到视图的最佳方法是什么?

Related 相关文章

  1. 1

    如何将图像从集合视图传递到集合视图

  2. 2

    将Backbone模型从集合传递到新视图将集合保存在内存中

  3. 3

    Java:迭代集合的最佳方法是什么?

  4. 4

    从Windows共享文件到Boot2docker VM的最佳方法是什么?

  5. 5

    如何将数据从集合视图传递到表视图类?

  6. 6

    使用委托将数据从集合视图控制器传递到视图控制器

  7. 7

    无法将数据从集合视图传递到 Xcode 中的详细信息视图

  8. 8

    使用反向引用的最佳方法是什么?

  9. 9

    引用Akka演员的最佳方法是什么

  10. 10

    引用 vm 文件时出现 Impex 错误

  11. 11

    Backbone.js-将变量从路由传递到视图/集合/模型

  12. 12

    将列表集合绑定到列表视图

  13. 13

    减少和合并对象集合的最佳方法是什么

  14. 14

    就速度而言,过滤Java集合的最佳方法是什么?

  15. 15

    集合视图是什么?

  16. 16

    类在类属性中引用自身的最佳方法是什么?

  17. 17

    引用核心数据实体的最佳方法是什么?

  18. 18

    选择与大型集合匹配时基于位掩码排除项的一组特征的最佳方法是什么?

  19. 19

    选择与大型集合匹配时基于位掩码排除项的一组特征的最佳方法是什么?

  20. 20

    使用KVM将脚本传递到VM

  21. 21

    创建对采用自我的方法的引用的集合的惯用方式是什么?

  22. 22

    将引用传递给道具的正确方法是什么?

  23. 23

    如何将数据传递到导航控制器中嵌入的集合视图控制器

  24. 24

    使用vm而不是$ scope的引用指令属性

  25. 25

    使用vm而不是$ scope的引用指令属性

  26. 26

    为什么将集合绑定到数据网格会导致不同的集合视图?

  27. 27

    无法通过ViewComposer将集合传递给视图

  28. 28

    将数据从多个表/一个数据库传递到视图的最佳方法是什么?

  29. 29

    将数据从多个表/一个数据库传递到视图的最佳方法是什么?

热门标签

归档