2016-10-04 2 views
-1

내 목표는 내 응용 프로그램에서 데이터, 환경 설정 등을 공유하는 singletin을 사용하는 것입니다. 전체 응용 프로그램에서 싱글 톤으로 만들고 싶다면 2 방향 바인딩 가능 INotify를 사용하여 WPF에서.WPF 바인딩을위한 INotify를 사용하여 설정을위한 정적 싱글 톤/저장소 만들기

읽을 수 있습니다 .net 4.5는 StaticPropertyChanged을 활용할 수 있습니다. 따라서 문서화가 어떻게 구현 될지 궁금해 할 것입니다.

public static class Global 
{ 
    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; 
    private static void CallPropChanged(string Prop) 
    { 
     StaticPropertyChanged?.Invoke(Settings, new PropertyChangedEventArgs(Prop)); 
    } 
    private static Store Settings = new Store(); 

    public static int setting1 
    { 
     get { return Settings._setting1; } 
     set { if (value != Settings._setting1) { Settings._setting1 = value; CallPropChanged("setting1"); } } 
    } 
} 

internal sealed class Store 
{ 
    internal int _setting1; 
} 

내가 원하는 것을 올바르게 추적하고 있습니까?

편집 : 제작 일부 수정 :

public sealed class Global:INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    static readonly Global _instance = new Global(); 

    private int _setting1; 
    private int _setting2; 

    private void CallPropChanged(string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) 
    { 
     if (EqualityComparer<T>.Default.Equals(field, value)) return false; 
     field = value; 
     CallPropChanged(propertyName); 
     return true; 
    } 

    private Global() { } 

    public static int setting1 
    { 
     get { return _instance._setting1; } 
     set { _instance.SetField(ref _instance._setting1, value); } 
    } 
    public static int setting2 
    { 
     get { return _instance._setting2; } 
     set { _instance.SetField(ref _instance._setting2, value); } 
    } 

} 
+0

시도해 본 결과가 좋았습니까? 그렇다면 귀하의 질문은 무엇입니까? 그렇지 않다면 무슨 일이 일어나고 무엇이 _ 구체적으로 도움이 필요합니까? 만약 당신이 싱글 톤을 구현했다면 (게시 한 코드는 그런 것을 수행하지 않습니다), 싱글 톤 객체 자체는 평소처럼'INotifyPropertyChanged'를 구현할 수 있습니다. 질문을 개선하여 실제로 문제가있는 것이 무엇인지 분명하게 이해하십시오. 실행중인 모든 문제를 확실하게 재현 할 수있는 좋은 [mcve]를 포함시켜야합니다. –

+0

@PeterDuniho 싱글 톤을 생성하는 정적 인 방법으로 인스턴스 저장소를 정의하지 않습니까? 또는 각 호출에서 상점의 새 인스턴스를 계속 작성합니까? static에 바인드하고 싶습니다. static은 INotify를 구현할 수 없습니다. – Wobbles

+0

_ "싱글 톤을 생성하는 정적 한 방법으로 인스턴스 저장소를 정의하지 않습니까?" "싱글 톤"이라는 용어는 매우 구체적인 의미를 지니 며 게시 한 코드에는 적용되지 않습니다. 싱글 톤을 사용하면 클래스의 _single_ 인스턴스를 반환하는 public static 속성을 갖지만 클래스 자체와 모든 멤버는 정적이 아닙니다. 그런 다음 인터페이스 (예 :'INPC')를 구현할 수 있습니다. _Stead__'StaticPropertyChanged'를 사용할 수도 있지만, 이것은 싱글 톤이 아닙니다. WPF가 처리 할 수있는 정적 클래스 일뿐입니다. 예 : [이 답변] (http://stackoverflow.com/a/9786554). –

답변

0

나는 StaticPropertyChanged에 익숙하지 않은,하지만 난이 같은 싱글 viewmodels을 구현 한 :

public class MyViewModel : ViewModelBase 
{ 
    public static MyViewModel Instance { get; set; } 
    public static ICommand MyCommand { get; set; } 

    public MyViewModel() 
    { 
     Instance = this; 
    } 
} 

와 결합 된 버튼 등을 XAML에서 다음과 같이 :

<Button Content="Click Me" Command="{x:Static vm:MyViewModel.MyCommand}" CommandParameter="MyParameters" /> 

정적 필드에 바인딩하려면 x : Static 접두사를 사용할 수 있습니다 s이며, 일반적으로 INotifyPropertyChanged를 사용할 수 있습니다 ...이 특정 바인딩은 실제로 VM의 싱글 톤 인스턴스가 필요하지 않지만 싱글 톤 모델을 고수하기 위해 {x : Static VM : MyViewModel .Instance.Whatever}

+0

Im 'Instance'를 통해 속성에 액세스해야한다고 가정하고 인스턴스 내부의 정적 속성은 무엇입니까? MyCommand는 인스턴스 여야합니까? MyViewModel.Instance._MyCommand' 필드에 접근하는 지름길 인 경우에만'MyCommand' static을 만드는 이유는 무엇입니까? 권리? 또는 나는 방금 LOL을 잃어 버렸다. – Wobbles

+0

위의 내용은 싱글 톤 구현이 아닙니다. 싱글 톤 패턴에는 몇 가지 특정 요구 사항이 있으며, 그 중 하나는 유형의 인스턴스를 두 개 이상 만들 수 없다는 것입니다. 생성자는 private이며 해당 유형의 _single_ 인스턴스를 저장하는 정적 필드가 있으며 한 번만 초기화됩니다. 패턴을 더 잘 구현하면 생성자의 필드가 초기화되지 않습니다. .NET에서'Lazy '클래스는 생성하는데 비용이 많이 들고 항상 사용되지는 않는 싱글 톤에 유용합니다. 그렇지 않으면 간단한 필드 초기화 프로그램으로 충분합니다. –

+0

@PeterDuniho 제 2 예제에서는 아직 싱글 톤이 아니라고 말합니다. 싱글 톤 예제에서 코드를 복사하고 있으므로 다른 코드가 있는지 잘 모르겠습니다. – Wobbles

관련 문제