아마도 MVVM 전문 지식을 가진 사람이 다음과 같은 좋은 아이디어인지에 대한 의견을 제시 할 수있을 것이라고 생각했습니다.MVVM 및 상태 기반 명령 - 좋은 아이디어 또는 나쁜 아이디어?
나는 Marlon이 포함 된 Sacha Barber의 Cinch MVVM 프레임 워크를 사용하고 있습니다. Grech의 SimpleCommand 클래스.
이 클래스에는 다른 대체 방법이없는 것 중 하나는 UI 요소를 명령 작업의 '제목'에 바인딩하는 데 일반적으로 사용할 수있는 Text 속성입니다. 따라서 Text 속성을 노출하는이 클래스의 확장 기능을 작성했습니다.
이제는 내가 명령을 사용하여 장치에 대한 연결을 전환하는 유스 케이스에 대해 살펴 보았습니다. 이 방법을 구현할 수있는 여러 가지 방법이 있습니다 (소프트웨어는 항상 존재하지 않습니다!). 한 가지 방법은 내 ViewModel에서 여러 명령 객체를 노출하는 것입니다. 하나는 'Disconnect'이고 다른 하나는 'Connect'입니다. 뷰 모델이 연결 상태 (IsConnected)를 나타내는 특성을 노출시키고 뷰를 조건부로 연결 명령 또는 연결 끊기 명령에 바인드하도록하십시오. 그래도이 옵션에 대한 나의 반응은 ... y!
처음에는 대신 Text 속성을 제공 할뿐만 아니라 명령 개체를 INotifyPropertyChanged로 구현하여 시스템 상태에 따라 텍스트 속성을 viewmodel에서 '연결'또는 '연결 끊기'로 동적으로 변경할 수 있습니다. . 이렇게하면 여러 명령을 사용하지 않고 단일 'ToggleConnection'명령 개체 만 노출 할 수 있습니다.
그러나이 경로를 시작하면 명령 상태에 따라 UI를 변경해야하는이 패턴의 다른 변형이있을 수 있습니다. 예를 들어 연결 상태에 따라 명령 텍스트를 변경하는 것 외에도 연결 상태에 따라 아이콘을 변경해야하는 위치가있을 수 있습니다. 그래서 INotifyPropertyChanged를 구현하는 'Stateful'클래스를 작성하고 'Text'와 'State'의 두 속성을 노출합니다. 나는 사용자가 국가의 유형을 정의 할 수 있도록 클래스를 범용으로 만들었습니다 (나는 대개 피할 수있는 곳에서는 '객체'를 사용하지 않는 것을 선호합니다).
내가 가진 질문은 ... 이것이 좋은 생각인지 나쁜 생각입니까? 그것은 명령의 원래 의도/설계와 다른 것일 수 있습니다. 필자가 보았던 것에서는 명령 객체가 시스템의 '동사 (verb)'이기 때문에 무국적자가되는 것이 일반적 일 수 있습니다. 라우트 된 명령을 사용하여 명령의 대상 만 정상적으로 상태가 될 것으로 예상됩니다. 특히 동일한 명령이 명령 바인딩이 선언 된 위치에 따라 다른 처리기로 라우팅 될 수 있기 때문에 특히 그렇습니다.
그래서 적어도 라우트 된 명령을 사용하면 상태가 이해가되지 않을 것이라고 생각합니다.
그러나 라우트 된 명령을 다루지는 않습니다. MVVM 명령을 특별히 다루고 있습니다. 이 경우 기본적으로 명령의 조건부 라우팅은 없습니다. MVVM 뷰는 특정 뷰 모델의 명령 객체에 직접 바인딩되며 핸들러를 실행하고 실행할 수 있습니다.
이 경우 이해가 되나요?
사용 목적/관심사를 위해 문제의 코드 사본을 첨부했습니다.
감사합니다, 필
감사합니다 앤더슨, 좋은 의견. 필자의 불편 함은 이전에 라우트 된 명령의 사용으로 인한 것이지만 MVVM 명령의 모든 동작은 다릅니다. 일반적으로 여러 UI 요소가 바인딩되어 있으므로 한 곳에서 명령 텍스트를 사용하는 것이 더 좋습니다. viewmodel을 현지화를 수행하는 것이 약간 펑키 한 것처럼 보일 수도 있지만 UI보기를 제공하는 것과 분명히 밀접하게 연관되어 있습니다. UI를 동적으로 생성 할 때 몇 가지 장점을 볼 수 있습니다. 명령 객체의 텍스트를 만드는 스타일/데이터 템플릿으로 명령 목록에 바인딩합니다. 건배! – Phil
이 특별한 경우에 당신은 여전히 아무것도 얻지 못하고 있습니다. .Text 속성에 대해 동일한 명령에 여러 개의 단추를 바인딩하는 것을 알았지 만 ViewModel "ConnectionText"또는 이와 유사한 속성의 다른 속성에 바인딩하는 것과 어떻게 다른 것입니까? 당신이 그것에 대해 생각하기를 바랍니다 ... 당신은 여기서 symantics를 말하고 있습니다 ... 그들은 당신의 사용 시나리오에서 본질적으로 똑같습니다. –
나는 앤더슨이 말하는 것을 얻었고, 당신이 묘사하는 것처럼 ConnectionText 속성을 가지고 있다고 생각했다. 그래도 난 전에 다 볼 수 있고, 좋아 한 어떤 명령과 함께 상대 바인딩의 사용 예이다 : 콘텐츠 = "{바인딩 RelativeSource = {RelativeSource 자체}, 경로 = Command.Description}" I 이는 여러 가지 이유로 다음과 같이 나타납니다. 1. 속성 참조를 지정해야하는 장소의 수를 줄입니다. 버튼에 표시된 텍스트 또는 '제목'을 말하면 MVVM 명령과 텍스트 속성 인 2에서부터 1까지입니다. – Phil