WPF > 구현: ObservableCollection 형식의 Singleton 사용 > 데이터 추가 + DataGrid에 바인딩

운영 환경
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community

배경



MVVM에서 여러 VM이 있다고 가정합니다. 그것들에서 특정 데이터를 동기화하기를 원합니다. 즉, 하나의 VM에서 데이터가 업데이트되면 다른 VM에서 업데이트가 반영되어야합니다.

처음 생각한 것은 VM끼리의 교환이었지만, 이하를 발견했다.


MVVM에서는 ViewModel끼리 서로를 조작할 필요는 기본적으로는 없습니다. 소유 관계는 있는 일이 있습니다만 원래 ViewModel는 Model의 그림자입니다. 그리고 View는 ViewModel의 그림자이기도합니다.

그렇다면 이런 경우 싱글톤을 사용하게 될까.

MVVM에서 Model을 여러 ViewModel에서 사용

참고



참고 : Unity C# 싱글톤 패턴 구현
정보 감사합니다.

위의 구현에 관해서, 자신이 사용하고 싶은 ObservableCollection<TestItem>에 대응했다.

파일 구성


  • VideModelBase.cs

  • @hugo-sb 님의 코드를 사용했습니다.
  • 감사합니다.
  • ぃ tp // m / 후고 sb / ms / f07 에 f53 817d198475

  • ViewModel.cs
  • SampleSingleton.cs : 싱글 톤 용
  • TestItem.cs : TestItem 항목 정의
  • MainWindow.xaml : 디자인
  • MainWindow.xaml.cs : 코드 숨김

  • 구현



    ViewModel.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    //
    using System.Collections.ObjectModel;
    
    namespace _170702_t1115_singleton_ObsCol
    {
        class ViewModel : ViewModelBase
        {
            // コンストラクタ
            public ViewModel()
            {
                myItem = SampleSingleton.Instance;
                myItem.Add(new TestItem { Id = 0, Name = "7of9", Age = 30, Gender = "Female" });
    
                var data2 = SampleSingleton.Instance;
                data2.Add(new TestItem { Id = 1, Name = "Janeway", Age = 50, Gender = "Female" });
            }
    
            public ObservableCollection<TestItem> myItem { get; set; }
        }
    }
    

    SampleSingleton.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    //
    using System.Collections.ObjectModel;
    
    namespace _170702_t1115_singleton_ObsCol
    {
        class SampleSingleton
        {
            private static ObservableCollection<TestItem> instance;
    
            private SampleSingleton()
            {
            }
    
            public static ObservableCollection<TestItem> Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new ObservableCollection<TestItem>();
                    }
                    return instance;
                }
            }
        }
    }
    

    TestItem.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace _170702_t1115_singleton_ObsCol
    {
        class TestItem
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public string Gender { get; set; }
        }
    }
    

    MainWindow.xaml
    <Window x:Class="_170702_t1115_singleton_ObsCol.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:_170702_t1115_singleton_ObsCol"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.DataContext>
            <local:ViewModel/>
        </Window.DataContext>
        <Grid>
            <DataGrid x:Name="dataGrid1" ItemsSource="{Binding myItem}"/>
        </Grid>
    </Window>
    

    MainWindow.xaml.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace _170702_t1115_singleton_ObsCol
    {
        /// <summary>
        /// MainWindow.xaml の相互作用ロジック
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
        }
    }
    

    실행





    data1과 data2에서 추가한 항목이 모두 표시되어 있다.
    Singleton으로서 기능하고 있는 것을 볼 수 있다.

    좋은 웹페이지 즐겨찾기