2017-12-22 6 views
0

필자는 본질적으로 동일한 객체의 여러 컨트롤 패널 인 UWP 응용 프로그램에서 작업하고 있습니다. Plate 객체라고 부르 자고합니다.여러 프레임과 여러 개체간에 데이터 바인딩을 유지하는 방법은 무엇입니까?

기능적으로 사용자는 특정 속성을 가진 Plate 객체를 제거 할 수 있어야하며 현재 사용 가능한 모든 Plate 객체가 해당 고유 속성과 함께 수정할 수있는 컨트롤과 함께 Main Page에 표시됩니다.

이 방법은 기본 페이지에서 그리드를 만들고 사용 가능한 각 플레이트에 대해 프레임을 그리드 열에 추가하고 각 프레임을 사용자 정의 PlateView 페이지로 이동하여 기본적으로 가로줄을 표시합니다 PlateView 열 목록.

내 문제는 각 Plate에서 해당 PlateView 로의 각 컨트롤/속성에 대한 양방향 데이터 바인딩이 가능하기를 원합니다.

지금까지 전체 수명주기를 통해 응용 프로그램의 여러 부분에서이 마스터 목록을 가져오고 수정할 수 있어야하므로 모든 플레이트 목록을 App.cs의 공용 변수로 저장했습니다.

UWP 문서에서 데이터 바인딩 설명을 이해하는 방식으로 Plate 객체가 INotifyPropertyChanged를 구현하거나 구현하는 별도의 PlateViewModel 클래스를 만들 수 있습니다.

Plate를 구현할 때 PlateView는 ViewModel을 List (this.ViewModel = App.plateList [1])의 올바른 Plate 인덱스로 설정하지만 사본을 만드는 것으로 가정합니다 ...? 따라서 PlateView에서 변수를 수정하면 실제로 App.cs.x에서 Plate 객체가 변경되지 않습니다.

새로운 PlateViewModel 클래스를 사용하면 같은 문제가 발생하지 않지만 PlateViewModel 클래스 내부에서 어떻게 작동하는지 이해할 수 없습니다. 예를 들어, MS의 문서를 보여줍니다 : 나는 PlateViewModel 내부 내부 플레이트 객체를 설정하더라도

public class RecordingViewModel 
{ 
    private Recording defaultRecording = new Recording(); 
    public Recording DefaultRecording { get { return this.defaultRecording; } } 
} 

을, 나는 XAML에서 변수 호출 할 필요가 없습니다 {X : 바인드 ...} 구문을? 따라서 올바른 Plate에서 PlateViewModel에 모든 변수의 복사본을 만들어야하고 App.cs의 원래 Plate 객체에 반드시 연결하지 않아도됩니까?

감사합니다.

답변

0

MVVM에 대한 전체적인 토론없이 간단히 질문에 대답하려면 추가 ViewModel 속성을 바인드하여 목록의 새 인스턴스를 만들지 마십시오.

뷰 모델 :

public List<Plate> MyPlates 
{ 
    get 
    { 
     return ((App)Application.Current).MyGlobalListofPlates; 
    } 
    set 
    { 
     ((App)Application.Current).MyGlobalListofPlates = value; 
     OnPropertyChanged("MyPlates"); 
    } 
} 

그 코드 내가 뭘 할 것은합니다 (App.cs 속성이 모델이 경우에) 게터와 세터와 모델을 제시하는보기 모델 속성을 만드는 것입니다 그것은 새로운 객체가 아니라는 것을 분명히하고 데이터의 변경이 허용되는지에 대해 당신에게 어느 정도 통제권을 부여합니다. 또 다른 옵션은 생성자에서 속성을 할당하는 것입니다. 이것은 새로운 객체를 생성하지 않습니다. 원본에 대한 참조이며 변경 사항은 모든 곳에서 반영됩니다.

public List<Plate> MyPlates { get; set; } 

public MyViewModel() //Constructor 
{ 
    MyPlates = ((App)Application.Current).MyGlobalListofPlates; 
} 

이 두 번째 코드 블록에는 INotify가 없기 때문에 문제가 있습니다 (양방향 바인딩 일지는 모르겠지만 확실하지 않습니다 ...). 어쨌든 객체를 다른 객체에 할당하면 참조가 만들어집니다.C#에서는 값 유형과 참조 유형을 계속해서 읽고 싶습니다. 거의 언제든지 C#에서 "ThisObject = ThatObject"를 수행하면 메모리에있는 동일한 객체에 대한 포인터를 만들고있는 것입니다.

관련 문제