2012-03-23 4 views
0

프레젠테이션의 첫 번째 TextBox에 유효한 값이있을 때까지 비활성화하려는 DataGrid를 비롯한 여러 컨트롤이 있습니다. 그래서 부울 속성을 VM에 바인딩하고 xaml (아래)에 바인딩합니다.데이터 바인딩 및 포커스 조정

바인딩이 작동하지만 TextBox (MoneyToAllocate)에서 사용자를 '트래핑'하는 부작용이 있습니다.

아마도 TB 바인딩이 LostFocus이고 포커스를 이동하여 실제로 업데이트를 트리거 할 곳이 없기 때문일 수 있습니다. 이 문제를 해결하는 좋은 방법은 무엇입니까?

건배,
Berryl

뷰 모델

public bool HasMoneyToAllocate { get { return MoneyToAllocate.Amount > 0; } } 

public Money MoneyToAllocate { 
    get { return _moneyToAllocate; } 
    set { 
     if (value.Amount < 0) return; 

     _moneyToAllocate = new Money(value.Amount, SelectedCurrency); 
     NotifyPropertyChanged(() => HasMoneyToAllocate); 
    } 
} 

보기

<TextBox Text="{Binding MoneyToAllocate, Converter={StaticResource moneyConverter}}" /> 

    <DataGrid IsEnabled="{Binding HasMoneyToAllocate}" ... 

편집 내가 업데이트하여 PropertyChanged을 시도했지만 조금 지저분 것을 추가해야

텍스트 상자의 값 변환기로 포맷해야합니다. 다른 아이디어?

최종 편집

나는 이전에하지 탭이 탭 정지를 할 수 중지했다 다른 컨트롤을시키는까지 상처 때문에 텍스트 상자가 갈 수있는 곳이 있었다. Phil은 문제를 가장 잘 이해하고 답을 얻습니다. 사용자가 입력 할 수있는 값의 범위 (.001에서 decimal.MaxValue)는 업/다운을 비실용적으로 만듭니다.

답변

2

사용 UpdateSourceTrigger=PropertyChanged

<TextBox 
    Text="{Binding MoneyToAllocate, UpdateSourceTrigger=PropertyChanged, 
      Converter={StaticResource moneyConverter}}" /> 
+0

편집을 참조하십시오. – Berryl

+0

확장 된 WPF 툴킷에서와 같이 DecimalUpDown 컨트롤을 사용하는 것은 어떻습니까? 컨트롤에 유효한 숫자가 항상 있어야하고 UI가 0보다 클 때는 나머지 UI를 사용하도록 설정하십시오. – Phil

1

그럼 당신은 사용할 필요가 UpdateSourceTrigger =하여 PropertyChanged
- 당신이 결합 당신이 VM의 값을 사용하는 것은 텍스트 상자
에서 포커스가 이동 될 때까지 영향을받지 것을 사용하는 경우 - 그러나 바인딩에 UpdateSourceTrigger = PropertyChanged를 추가하면 VM 속성 (MoneyToAllocate)이 즉시 적용됩니다 (textBox.Text 값이 변경된 경우)

+0

을 참조하십시오. – Berryl