2017-01-30 1 views
0

저는 WPF 응용 프로그램을 작성했습니다. 지금까지 대부분의 ViewModel은 엄격하게 자체 코드에서 작동했습니다. 나는 최근에 기본 코드 "ApplicationViewModel"을 만들어 공통 코드를이 클래스로 마이그레이션하기로 결정했습니다. 대부분의 경우이 작업은 정상적으로 작동하지만 문제가 발생했습니다.View Model Base 클래스의 인스턴스를 하나만 확보하려면 어떻게해야합니까?

내 상속하는 뷰 모델이이 기본 뷰 모델의 인스턴스를 생성하고있는 것처럼 보입니다. 결과적으로; ClassA의 메소드가 기본 클래스의 변수를 변경해야하는 경우 ClassB는 여전히 null과 동일한 변수 또는 이전 값이 있던 값을 등록합니다.

처음에 나는이 문제를 해결할 마이크로 소프트의 단결 컨테이너에

public App() 
{ 

    Container.RegisterType<ApplicationViewModel>(new ContainerControlledLifetimeManager()); 
} 

을 인스턴스를 등록 생각하지만 아무것도 변경되지 않습니다.

연구 후에 발견 된 확실한 대답은 클래스를 정적으로 바꾸는 것이었지만 그 경로를 시작하기 전에 다른 솔루션을 선호했습니다. 프로그램 기능이 너무 많으면 재 작업이 필요할 수 있습니다.

싱글 톤 인스턴스 속성이 기본 클래스 선언과 함께 작동하는지 확실하지 않습니다.

그래서 내 질문에 가정합니다 :이 ViewModel 기본 클래스의 동일한 인스턴스가 모든 내 ViewModels에서 사용되는 것을 어떻게 보장하겠습니까?

+2

를 단일 인스턴스 공유가 불가능하며 그것은 심지어 의미가 없습니다. –

+0

다른 각도입니다; 단일 기본 클래스 인스턴스의 사용 사례는 무엇입니까? –

+0

클래스 구조의 개요를 게시하십시오. 약간의 C#은 설명보다 훨씬 명확합니다. 당신이 묘사하고있는 것은 그렇게 분명하지 않습니다. –

답변

2

이 ViewModel 기본 클래스의 동일한 인스턴스가 모든 ViewModel에서 사용되도록하려면 어떻게해야합니까?

불가능합니다. 기본 클래스는 기본 클래스와 상속 클래스가 동일한 인스턴스의 일부인 기본 클래스의 상속 된 클래스 정의의 일부입니다. dervived 클래스의 인스턴스를 만들면 해당 유형의 단일 인스턴스 만 만들어집니다.기본 유형은이 유형의 일부입니다.

상속에 대한 기본 클래스의 단일 인스턴스 만 원하는 경우 해결책이 아닙니다.

대신 당신이 아이 뷰의 각 모델에서 Container 사용하여 공유 뷰 모델 객체에 대한 참조를 얻을 수있는 모든 viewmodels 다음이 기본 뷰 모델에서 상속하는 경우

public class ChildViewModel //doesn't inhert from the base view model 
{ 
    public ChildViewModel() 
    { 
     var sharedViewModel = Container.Resolve<ApplicationViewModel>(); 
     //call any properties or methods of the sharedViewModel... 
    } 
} 
+1

음, 이것이 교육적인 사람이었습니다. 많은 감사. 당신의 솔루션은 천재였습니다. – Offer

0

viewmodels이 실제로 (기술적으로) 기본 클래스에서 상속 받으면 상속 된 viewmodel의 인스턴스 당 기본 클래스의 인스턴스가 필요합니다.

기존의 모든 뷰 모델에 대해 동일한 값을 저장하는 정적 클래스 (또는 싱글 톤 인스턴스)를 만들어 문제를 해결할 수 있습니다.

기본 클래스에는 여전히 이러한 정적 변수를 사용하는 비 정적 액세서 (get-/set 메서드)가 포함될 수 있습니다. 뷰 모델은 실제로 값이 저장된 위치를 알 필요가 없습니다.

실제로 이것은 정적이 아닌 기본 클래스의 일부 필드/속성을 정의하는 것에 매우 가깝습니다. 어쩌면 이것도 옵션 일 수 있습니다.

0

죄송 합니다만, 기본 클래스의 한 인스턴스와 파생 클래스의 다른 인스턴스를 가질 방법이 없습니다.

다음 디자인을 제안 할 수 있습니다. 파생 클래스에 대한 기본 클래스의 보호 특성을

private static Dictionary<string, object> _hash = new Dictionary<string, object>

을 그리고 만들 : 기본 클래스에서 필드를 만들

protected string Title { 
get { 
    string value; 
    ApplicationViewModel._hash.TryGetValue("Title", out value); 
    return value; 
    } 
    set { 
    ApplicationViewModel._hash["Title"] = value; 
    } 
} 

내가 그런 당신을 위해 스위트 룸 바랍니다.

관련 문제