2009-08-24 2 views
1

아마도 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 뷰는 특정 뷰 모델의 명령 객체에 직접 바인딩되며 핸들러를 실행하고 실행할 수 있습니다.

이 경우 이해가 되나요?

사용 목적/관심사를 위해 문제의 코드 사본을 첨부했습니다.

감사합니다, 필

답변

1

정말 당신까지 당신이 생각하는 것이 작업하기 쉬울 것입니다.

개인적으로 .Text 속성을 내 명령에 넣지 않습니다. 단순히이 명령을 다시 사용하지 않기 때문입니다.프레임 워크 (또는 이와 유사한 사용자 정의 정적 명령)에서 제공되는 RoutedUICommands와는 사방에서 재사용되며 "Exit"의 변환이 해당 명령에서 변경되면 응용 프로그램 전체에 반영됩니다. 귀하의 예에서는 그렇지 않습니다. 모든 것이 일회적 일 것입니다.

이 경우 버튼 텍스트의 텍스트는 실제로 명령에서 분리됩니다 (다른 하나가 영향을 미치더라도). 따라서 더 쉽게 끝나고 코드를 분리하는 코드가 조금씩 줄어들지 만 차이점은 없습니다. 그렇게 많이 될 것이고 그것은 무엇보다 맛의 문제가 될 것입니다.

2 커맨드 - blech에서 당신과 확실히 같습니다. 당신이 쓰는 대부분의 버튼 대리자는 어떤 식 으로든 국가에 반응해야합니다 (대화를하는 서비스가 다운되고, 사용자가 이것을 선택하면이 데이터가이 방식으로 채워 져야 함). 그래서 나는 그것이 잘못되었다고 생각하지 않습니다. 대리인은 ViewModel에 대한 상태 정보에 적응합니다.

어쨌든, 이것은 약간 말입니다 ... 테이크 아웃은 "무엇이든지 편안함을 느낍니다"입니다.

+0

감사합니다 앤더슨, 좋은 의견. 필자의 불편 함은 이전에 라우트 된 명령의 사용으로 인한 것이지만 MVVM 명령의 모든 동작은 다릅니다. 일반적으로 여러 UI 요소가 바인딩되어 있으므로 한 곳에서 명령 텍스트를 사용하는 것이 더 좋습니다. viewmodel을 현지화를 수행하는 것이 약간 펑키 한 것처럼 보일 수도 있지만 UI보기를 제공하는 것과 분명히 밀접하게 연관되어 있습니다. UI를 동적으로 생성 할 때 몇 가지 장점을 볼 수 있습니다. 명령 객체의 텍스트를 만드는 스타일/데이터 템플릿으로 명령 목록에 바인딩합니다. 건배! – Phil

+0

이 특별한 경우에 당신은 여전히 ​​아무것도 얻지 못하고 있습니다. .Text 속성에 대해 동일한 명령에 여러 개의 단추를 바인딩하는 것을 알았지 만 ViewModel "ConnectionText"또는 이와 유사한 속성의 다른 속성에 바인딩하는 것과 어떻게 다른 것입니까? 당신이 그것에 대해 생각하기를 바랍니다 ... 당신은 여기서 symantics를 말하고 있습니다 ... 그들은 당신의 사용 시나리오에서 본질적으로 똑같습니다. –

+0

나는 앤더슨이 말하는 것을 얻었고, 당신이 묘사하는 것처럼 ConnectionText 속성을 가지고 있다고 생각했다. 그래도 난 전에 다 볼 수 있고, 좋아 한 어떤 명령과 함께 상대 바인딩의 사용 예이다 : 콘텐츠 = "{바인딩 RelativeSource = {RelativeSource 자체}, 경로 = Command.Description}" I 이는 여러 가지 이유로 다음과 같이 나타납니다. 1. 속성 참조를 지정해야하는 장소의 수를 줄입니다. 버튼에 표시된 텍스트 또는 '제목'을 말하면 MVVM 명령과 텍스트 속성 인 2에서부터 1까지입니다. – Phil

0

마지막 포스터처럼 "무엇이든지 편안함을 느낍니다."

제 경우에는 보통 DelegateCommand과 같은 것을 사용합니다. 일부 데이터에 바인딩해야하는 경우 VM에 바인딩됩니다. 명령이 실행되면 내 VM 내에서 실행됩니다 (delegate를 통해 DelegateCommand에 제공됨). 그런 다음 실행 된 델리게이트는 명령을 만족시키기 위해 재사용 가능한 코드를 실행할 수 있습니다.

Command를 자체 VM으로 사용하려는 것 같습니다. 나는 너 자신에게 이것을하기의 결코 생각하지 않았다, 그러나 그것이 당신에게 좋게 느끼는 경우에, 그것을하십시오! :)

+0

나는 그것을 넣는 좋은 방법이라고 생각한다. 명령은 일종의 미니 VM이된다! 건배 :) – Phil

관련 문제