2010-01-22 2 views
0

내 WPF 앱에서 MVVM 패턴 및 명령에 문제가 있습니다. 문제는 MVVM 패턴이 아니라 내 GUI에서 진행되는 것입니다. 상황을 설명해 드리겠습니다 :이 특정 WPF 상황에서 MVVM 및 명령을 어떻게 적용 할 수 있습니까?

내 응용 프로그램은 일부 파일을 처리 할 수 ​​있습니다. 함수가있는 클래스가 있습니다 DoStuff(int limit).

  • ButtonDoStuffBtn이 분석을 시작 : 내 사용자의 사용자 인터페이스는 다음과 같은 항목이 있습니다.
  • TextBoxLimitTxt으로 작성하십시오.
  • CheckBoxLimitChk 제한을 사용하거나 사용하지 않도록 설정할 수 있습니다.

"LimitChk"의 선택을 취소하면 LimitTxt.Text = ""LimitTxt.IsEnabled = false입니다. LimitChk을 다시 확인하면 다시 LimitTxt.IsEnabled = false을 입력하지만 내용을 입력 할 때까지 텍스트가 비어 있습니다.

WPF 및 MVVM의 명령에 대한 많은 자습서를 읽었지 만 필자의 경우는 그 곰팡이. 내가 준 예제는 사실 내 UI의 일부분이지만이 작업을 훌륭하게 수행 할 수는 없습니다. 내가 같은 질문에 계속 실행

:

  • 내가 LimitChkCommands (사용 및 사용 안 함) 또는 한 (토글)가 필요합니까?
  • intLimitTxt에 바인딩하면 비워두면 어떻게됩니까?
  • DoStuffBtn을 눌렀을 때 DoStuff(Int32.Parse(LimitTxt.Text))을 사용하는 것은 깨끗한 방법일까요?
  • LimitChk에서 두 개의 명령을 사용하는 경우 의 기능이 ICommand 일 때 LimitChk이 활성화되었는지 여부를 결정하는 것은 어떻게됩니까?

그럼 내가 설명한 상황은 WPF에서 명령을 사용하여 좋은 패턴에 어떻게 맞습니까?


뭐 :

WPF, 명령 및 MVVM i에서 일부 링크

는 검토 한 지금까지 UI에서 가능한 한 많이 유지해야한다는 것을 이해합니다. 심지어 UI가 UI에 영향을 미칩니다. 나는. 선택을 취소하면 LimitChk LimitText이 비활성화됩니다. 여전히 UI 관련 정보와 작업 및 실제 수행해야 할 작업과의 차이점을 유지해야한다고 생각합니다.

+0

저와 같은 jmorrill의 지루한 사람들에게 축하합니다. – kenwarner

답변

1
컬러와 같은 불필요한 물건을 떠나

그냥 몇 가지 높은 수준의 생각을, 및 정렬 속성, WrapPanels 등

귀하의 ViewModel aa는 몇 가지 특성을 가지고

:

public bool? LimitIsChecked { get; set; } 
public bool LimitTextIsEnabled { get; set; } //to be expanded, below 
public ICommand ParseCommand { get; private set; } // to be expanded, below 
public string LimitValue { get; set; } // further explanation, below 

귀하의 XAML 체크 박스와 텍스트 상자의 정의 뭔가가 같은 :

<CheckBox Content="Limit Enabled" IsChecked="{Binding LimitIsChecked}" /> 
<TextBox Text="{Binding LimitValue}" IsEnabled="{Binding LimitIsEnabled}" /> 
<Button Content="Parse" Command="{Binding ParseCommand}" /> 
당신은이 같은 ParseCommand 뭔가를 초기화 할 수 있습니다

:

this.ParseCommand = new DelegateCommand<object>(parseFile); 

지금, 너무 그 LimitTextIsEnabled 속성에 채우게 :

public bool LimitTextIsEnabled { 
    // Explicit comparison because CheckBox.IsChecked is nullable. 
    get { return this.LimitIsChecked == true; } 
    private set { } 
} 

귀하의 parseFile 방법은 다음 실제 구문 분석을 수행 논리에 LimitValue 속성의 값을 전달한다.

LimitValue 속성을 문자열로 선언하여 명시 적 변환기 또는 다른 유효성 검사 코드로 코드가 복잡해지지 않도록했습니다. "LimitValue는 유효한 int입니다"확인/변환을 여러 가지 방법으로 처리하도록 선택할 수 있습니다.

물론이 모든 것을 구현하지는 않았지만 다른 위젯의 상태를 업데이트하기 위해 명령을 사용하지 않는 패턴을 개략적으로 설명하고자했습니다. 대신, ViewModel에서 관리되는 속성에 해당 속성을 바인딩하십시오.

+0

흥미로운 솔루션입니다. 따라서 UI에서 다른 요소에 영향을주는 요소 (예 : 텍스트 상자의 상태에 영향을 미치는 체크 상자의 상태)가 올바르게 이해되면 뷰 모델을 통과해야합니다. 나는 그 DelegateCommand 것이 무엇인지 조사해야 할 것입니다. 아, LimitTextIsEnabled 속성에 개인 집합이 필요한 이유는 무엇입니까? 감사합니다 –

+0

네, 거기에 일반적인 생각이 있습니다. LimitTextIsEnabled는 개인 집합을 필요로하지 않지만 공용 집합을 필요로하지 않습니다. :) 'DelegateCommand '이 (가) http://msdn.microsoft.com/en-us/library/cc707894.aspx에서 왔습니다. – JMD

3

나는 혼란스러워하고 있다고 생각합니다 ...여기에 명령이 필요 없으면 바인딩을 사용할 수 있습니다.

  • 내가 LimitChk (사용 및 사용 안 함) 또는 한 (토글)에 대한 두 개의 명령어가 필요하십니까?

아무 것도 필요 없습니다. 그냥 내가 LimitTxt에 int를 결합하면 나는 그것이 빈 만들고 그것을 사용하지 않으면 (IsChecked="{Binding LimitEnabled}")

  • 은 어떻게됩니까에 CheckBox 당신의 ViewModel에 LimitEnabled 속성을 생성하고 바인딩?

는 효과가 없습니다 비활성화. 당신은 TextBox 빈 할 경우, 빈 문자열을 int로 (적어도와 기본 계산기)

  • 그냥 구문 분석을 (사용할 수있는 깨끗한 방법인가로 변환 할 수 없기 때문에 실패합니다 바인딩 Int32.Parse (LimitTxt.Text)) ParseBtn을 누를 때?

필요하지 않습니다. ViewModel에 Limit 속성을 만들고 TextBox을 바인딩하면됩니다. 유효하지 않은 입력을 강조 표시하기 위해 BindingExceptionValidationRule을 추가 할 수 있습니다.

버튼이 필요하지 않습니다. TextBox이 포커스를 잃을 때 자동으로 구문 분석이 수행됩니다 (기본값 : UpdateSourceTrigger을 사용하는 경우). 구문 분석 방식을 사용자 지정하려는 경우 바인딩에 사용할 사용자 지정 변환기를 만들 수 있습니다.

+0

한계에 대한 정보는 설정해야 할 속성이 아니라 LimitChk를 확인할 때 UI의 일부 내용을 변경해야합니다. 또는 LimitEnabled가 변경되면 속성 수신기를 만들어야합니까? int32에 대해 말하는 동안 버튼에 대한 파스를 선택하는 것이 좋지 않을 수 있습니다. 경계. Button의 Parse는 실제로 다른 Parse입니다. 나는 DoStuff로 바꿀 것이다. –

관련 문제