2010-12-12 1 views
7

나는 ListBox와 3 개의 버튼이있는 DocumentListView.Xaml을 가지고 있습니다.WPF/MVVM : UserControl 뒤의 ViewModel이 아직 초기화되지 않은 상태에서 Button의 상태를 비활성화 하시겠습니까?

그 뒤에 UserControl은 3 개의 RelayCommands에 바인딩 된 3 개의 단추 및 해당 명령 속성이있는 DocumentListViewModel을 배치합니다.

AdministrationController, BillingController, ReportController와 같은 3 개의 컨트롤러가 있습니다.

모든 컨트롤러에는 고객 1 : N 주문 1 : N 문서와 같은 ObservableCollections가 있습니다.

한 명의 컨트롤러에서 나는 특별한 구속력이 있습니다. 내 DocumentListViewModel OrderViewModel (순서가로드/존재하지 않기 때문에) 부모 ViewModel에 의해 초기화되지 않은 다음 내 UserControl에 활성화 된 3 개의 단추가 있습니다. 사용자는 3 버튼을 눌러도 아무 일도 일어나지 않지만 여전히 매우 혼란스럽고 무엇보다도 내 사용자 인터페이스의 일관성이 사라졌습니다.

버튼 명령을 기본적으로 "사용 안 함"으로 설정할 수 있습니까?

단추 설정 IsEnabled 속성을 false로 설정하면 단추가 영구적으로 비활성화 상태로 유지되므로 도움이되지 않습니다. CanExecute TRUE를 설정하면 IsEnabled = true로 설정됩니다.

그리고 다른 속성 인 IsButtonEnabled를 소개하고 싶지 않습니다 ... 그 바보 같은 생각이 들었습니다. 왜냐하면 저의 버튼 논리 뒤에 winforms와 wpf가 있기 때문입니다. ICommand로 충분합니다.

답변

17

또는 사용하지 않도록 버튼의 스타일을 사용할 수 있습니다

<Style TargetType="{x:Type Button}" x:Key="DisablerButton"> 
    <Style.Triggers> 
     <Trigger Property="Command" Value="{x:Null}"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

스타일에 따라 IsEnabled 속성이 어떻게 TRUE로 설정되어 있습니까? – Elisabeth

+0

트리거가 눌려지지 않을 때마다 정상적인 절차가 호출됩니다. 예. Command 속성이 설정되고 CanExecute가 true로 평가되면. – Goblin

+0

작동! thats counts now! 감사합니다 고블린. – Elisabeth

5

이것은 흥미로운 상황입니다. 솔직히 UI가로드되고 상호 작용하지만 ViewModel이 아직 묶여 있지 않은 경우를 한번도 본 적이 없습니다.

그러나 잠시 무시하면 바인딩에서 FallbackValue를 사용하여 전역 적으로 사용 가능한 NullCommand 또는 CanExecute 메서드에서 항상 false를 반환하는 항목에 바인딩 할 수 있습니다.

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" /> 
+0

문제는 내 DocumentListView이다는 UserControl을 3 번 사용할 수 있습니다. Command = "{SaveCommand 바인딩, FallbackValue = {x : Null}}" "/> SaveButton은 여전히 ​​Enabled입니다. 하지만 Commanding을 통해이 기능을 비활성화하고 싶습니다. – Elisabeth

+0

맞아, 내 예제는 네가 지적한대로 x : Null 값이 아니라 전역 적으로 사용 가능한 NullCommand에 의존한다. 어쨌든 고블린의 해결 방법은 구현하기가 더 쉽습니다. – Josh

+1

이것은 특히 Silverlight의 경우 아주 좋은 솔루션입니다. –

관련 문제