WPF > 구현: ObservableCollection 형식의 Singleton 사용 > 데이터 추가 + DataGrid에 바인딩
13000 단어 myVisualStudioStudyWPF#migrated
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>
에 대응했다.파일 구성
@hugo-sb 님의 코드를 사용했습니다.
구현
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으로서 기능하고 있는 것을 볼 수 있다.
Reference
이 문제에 관하여(WPF > 구현: ObservableCollection 형식의 Singleton 사용 > 데이터 추가 + DataGrid에 바인딩), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/9067fe160aa110f7b838텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)