2014-10-22 2 views
0

컨트롤 바인딩이 OneWayToSourceOneTime처럼 동작 할 수 있습니까?WPF 바인딩을 사용하여 OneWayToSource 및 OneTime을

여기에 배경이 있습니다. 데이터 그리드가 있습니다. 각 행에는 텍스트 셀과 checkbox이 있습니다. checkbox이 선택되면 행의 데이터가 저장됩니다. 이제 사용자가 텍스트 셀에서 타이핑을 시작하면 이 체크되도록 내 ViewModel에서 IsChecked 속성을 변경합니다. 나는 이것이 한 번만 일어나기를 바란다. 예를 들어, 사용자가 타이핑을 시작하고 checkbox을 선택 취소하면 사용자가 값 입력을 다시 시작할 때이를 변경하고 싶지 않습니다.

OneWayToSourceOneTime 모두에 대한 바인딩 설정과 같은 소리는 해결책이되어야하지만 바인딩 모드는 하나의 값으로 만 설정할 수 있다는 것을 알고 있습니다. 유사한 결과를 얻지 만 결과가없는 몇 가지 제안 및 가능한 해결 방법을 찾고있었습니다. msdn 가입일

답변

1

: 어플리케이션 시작 또는 때만

일회용 대상 속성을 갱신의 DataContext는 OneWayToSourceOneTime의 조합을 이용하여 해결할 것을 의미 변화

를 겪게 될 때 '한 번만'업데이트로 문제가 발생해도 응용 프로그램 시작 또는 데이터 센터 텍스트 변경시 속성이 처음으로 변경되는 순간에는 트리거되지 않습니다.

텍스트 셀 텍스트를 일부 속성에 바인딩 할 때 IsChecked을 설정해야하는 경우 해당 속성에서 제어 할 수 있습니다.

private string text_ = ""; 
private bool isChecked_ = false; 
private bool autoSetChecked_ = true; 

public bool IsChecked 
{ 
    get 
    { 
    return isChecked_; 
    } 
    set 
    { 
    if (isChecked_ == value) { 
     return; 
    } 

    // If user manually changes check state assume the user wants to keep that state 
    // => Disable auto changing. 
    autoSetChecked_ = false; 
    isChecked_ = value; 
    OnPropertyChanged("IsChecked"); 
    } 
} 

public Text 
{ 
    get 
    { 
    return text_; 
    } 
    set 
    { 
    if (text_ == value) { 
     return; 
    } 

    text_ = value; 
    OnPropertyChanged("Text"); 

    if (autoSetChecked_) { 
     // Only set is checked if not done ever before. 
     autoSetChecked_ = false; 
     IsChecked = true; 
    } 
    } 
} 

편집 :이 당신이 당신의 ViewModel에서 체크 박스를 변경할 수 있도록 IsChecked - 결합은 양방향이 있어야합니다.

+0

답변 해 주셔서 감사합니다. 순전히 XAML에서이 결과를 얻을 수 있는지 궁금합니다. – PiotrWolkowski

+0

'OnFirstChangeAndOneWayToSource'- 바인딩이 필요합니다. 이는 순수한 xaml에서 작동하지만 속성이 변경되지 않은 경우에도 속성에 대한 코드 숨김/뷰 모델에서 변경 알림을 수동으로 발생시킬 수 있습니다. 이것은 항상 작동하지는 않지만 유즈 케이스/구현에 의존하기 때문에 바인딩 모드를 깨뜨릴 수 있습니다. – LaD1Da

관련 문제