2016-06-20 4 views
2

배경 : 본질적으로, 내장 된 격자 구현이 너무 느려서 (우리는 동시에 스크롤되는 100,000 개의 셀을 처리 할 수 ​​없기 때문에 사용자 정의 Android 렌더러로 Xamarin.Forms에서 Grid 시스템을 만들고 있습니다. 우리가 필요로하는). 나는 과잉 커플 링으로 이미이 작업을 성공적으로 마쳤습니다. 이제 감독관이 요청한 방식으로 리팩터링하고 있으므로 문제가 발생했습니다.컨테이너 개체에 속성이 변경된 개체에서 변경되었음을 알리는 방법은 무엇입니까?

시나리오 :

//In Xamarin.Forms project 
class GridItems : BindableObject { 
    //Handles/contains all logic to how this grid will be laid out and its children 
} 

//In Xamarin.Forms project 
class Grid : View { 
    GridItems Source { get; set; } 
} 

//In Xamarin.Android project 
class GridRenderer { 
    OnElementPropertyChanged() { 
     //Here I can check what properties inside Grid changed 
    } 
} 

이것은 분명히 매우 간단하지만, 이유는 설정이 방법은 그리드에 걸리는 항목의 어떤 종류의 당신은 단순히 서브 클래스 GridItems은 무엇을 수정할 수 있도록이다 셀/열의 문자열 값 등이 있어야하며 Grid 및 GridRenderer 클래스를 다시 사용해야합니다.

문제는 :

GridItems이 자체 내에서 수정

, 나는 Grid.GridItems 통지해야합니다. GridItems는 속성 변경 이벤트를 발생시킬 수 있지만 로컬 속성에 대해서만 실행됩니다. 그리드 변경된 GridItems 변경된 것을 GridRenderer 볼 수 있도록 GridItems "본질적으로 GridItems 속성 변경 이벤트 발생 시키십시오"알릴 수있는 GridItems 필요하며 화면에서 다시 그리기 자체를 무효화하십시오.

속성이 속성 자체에서 변경되었다는 것을 포함하는 개체에 알리는 좋은 방법이 있습니까? 아니면이 문제에 대해 모두 잘못 접근하고 있습니까?

+0

이것은 약간 순진 할 지 모르지만 [데이터 바인딩 가이드] (https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/)를 보았습니까? 여기서 말하는 것처럼 들리는'PropertyChanged'를 일으킬 모델을 만들 수 있습니다. – Paul

답변

1

그래서 나는이 작업을 수행 할 수있는 방법을 찾을 수 있었지만, 내 시나리오와 관련하여 대부분의 미래 사람들에게는 작동하지 않을 수 있습니다.

기본적으로 Grid와 GridItem은 모두 ViewModel (페이지 ViewModel)을 공유합니다. 즉, GridItem에 대한 바인딩이 수정 될 때 ViewModel은 바인딩을 통해 Grid에 간단하게 알릴 수 있으므로 ViewModel이 담당하는 것과 유사합니다.

"Invalidate"라는 Grid에서 바인드 가능한 부울 값을 만들었습니다. ViewModel이 GridItem에 대한 자식 바인딩을 수정할 때마다 Invalidate 바인딩을 true로 설정하여 수정합니다.

이제 사용자 지정 렌더러에서 Grid에 대해 ElementPropertyChange가 해제 될 때마다 유효성 검사를 시작했는지 확인합니다. & 무효화가 이제 true로 설정되었습니다. 이 경우 요소에서 Invalidate를 false로 다시 설정 한 다음 자체에서 Invalidate를 호출합니다 (가능한 경우 Draw 이벤트가 재개되고 화면을 다시로드 함).