lsirikh / ProperyExplorerTest

에로로님의 예제를 구현 및 응용해보자
0 stars 0 forks source link

Update #7

Closed lsirikh closed 2 years ago

lsirikh commented 2 years ago

쉬시는 날에 문의드립니다.

아마 주말에 쉬셔서 답변 없으실 것 같지만,, 어제오늘 계속 고민해보고 잘 이해가 안되는 부분을 올려봅니다.

  1. public class PanningStructure : DependencyObject 을 따로 선언해서 사용하시는 이유는 무엇일까요? 분석해보니까, public class InCanvasMovingBehavior : DependencyObject 여기 등록된 inner class고 주로 기능적인 측면을 담당하는 클래스 같았습니다.

1) 들어오는 ViewModel에 따른 PanningStructure를 생성하고, InCavasMovingBehavior 단에는 Xaml에 연동할 AP쪽을 세팅하는 역할을 하는 것 같앗습니다. 혹시, 이렇게 구현하신 이유는 무엇인지 알수 있을까요? 제가 ZLevel을 AP로 따로 구현해서 캔버스위의 오브젝트를 클릭하면 최상단으로 오는 로직은 구현을 했는데요. 정작 Property에서 기존의 저장된 BaseModel에 저장된 ZLevel의 값도 같이 변하고 다른것으로 연동해 놓으니까 ZLevel의 Property가 의미가 없어진 상황입니다. ㅎㅎ

그래서 생각을 해봤습니다. 평소에는 PropertyExplorer 창이 안나타나다가, 캔버스 위에 Rectangle 혹은 Ellipse 등 오른쪽 마우스 버튼을 누르면 메뉴가 나오고 메뉴를 클릭하면 창이 나타나는 구조를 구현하는 것 가능할까요?

한개 한개 구현하는 게 진짜 너무 어렵네요...ㅠㅠ

  1. 캔버스를 클릭하면 선택된 ListBoxItem이 전체 UnSelected 형태로 만드려면 어디에 Command를 넣어주면 될까요? RoutedCommand를 통해서 myListBox.UnselectAll(); 해주려고 하는데요. 아무래도 Scrollviewer에 걸리는데 어떻게 MVVM으로 처리해주면 좋을까요?

제가 일단 작업한 부분을 PR로 보내드립니다.

혹시 시간되시면 확인 부탁드립니다.

항상 감사드리며, 편안한 연휴 되세요~

shwlee commented 2 years ago
  1. public class PanningStructure : DependencyObject 을 따로 선언해서 사용하시는 이유는 무엇일까요? 분석해보니까, public class InCanvasMovingBehavior : DependencyObject 여기 등록된 inner class고 주로 기능적인 측면을 담당하는 클래스 같았습니다.

원래는 PanningStructure 역시 관리 대상으로 만들었습니다. 그래서 InCanvasMovingBehavior 에서 AP 로 get/set 하기 위해 DO 를 상속받은 거였는데, 생각해보니 딱히 관리가 필요 없을 거 같아서 InCanvasMovingBehavior 의 AP 를 삭제했고, PanningStruture 의 DO 상속은 제거하는 걸 빠뜨린 겁니다. DO 상속은 삭제해도 됩니다.(물론 그냥 둬도 됩니다.) PanningStruture 가 DO 에 의존적인 기능을 사용하지 않으니까 상관없습니다. 나중에 관리가 필요해 지면 그 때 다시 붙이면 되니까요.

  1. 들어오는 ViewModel에 따른 PanningStructure를 생성하고, InCavasMovingBehavior 단에는 Xaml에 연동할 AP쪽을 세팅하는 역할을 하는 것 같앗습니다.

렬루? 오해하시면 안 되는 게, InCavasMovingBehavior 역시 view 의 일부분입니다. 여기서 ViewModel 에 대한 접근은 MVVM 을 깨는 행위예요. 물론 인터페이스를 이용한 느슨한 결합으로 접근할 수도 있지만 엄격한 MVVM 구현 차원에서는 권장하지 않아요. 다시 확인해 보시죵. 진짜 ViewModel 인지.

그래서 생각을 해봤습니다. 평소에는 PropertyExplorer 창이 안나타나다가, 캔버스 위에 Rectangle 혹은 Ellipse 등 오른쪽 마우스 버튼을 누르면 메뉴가 나오고 메뉴를 클릭하면 창이 나타나는 구조를 구현하는 것 가능할까요?

당연히 가능하겠죠? 구현하는 방법은 많아요. 선택은 만드는 사람이 결정할 문제이지요.

  1. 캔버스를 클릭하면 선택된 ListBoxItem이 전체 UnSelected 형태로 만드려면 어디에 Command를 넣어주면 될까요? RoutedCommand를 통해서 myListBox.UnselectAll(); 해주려고 하는데요. 아무래도 Scrollviewer에 걸리는데 어떻게 MVVM으로 처리해주면 좋을까요?

전 개인적으로 엄격한 MVVM 패턴 구현 시 RountedCommand 추천하지 않아요. 구현체가 PresentationCore 에 정의되어 있거든요. RountedCommand 를 CustomControl 등, view 간 연결에서 사용하는 건 상관없지만, 어차피 ViewModel 에서는 사용 못하기 떄문에 쓸 수도 없고 쓰는 걸 권장하지도 않아요. Command 가 왜 필요한 지 이해하면 제 말이 이해가 될 겁니다.

요거는 제가 리뷰에 댓글 달아놓은 걸 확인하시면 될 듯... =ㅂ=