2012-06-06 10 views
2

일부 계산 결과에 따라 숨기거나 비활성화해야하는 컨트롤이 있습니다. IsEnabled 또는 IsVisible 속성을 부모 폼 클래스의 일부 메서드 나 속성의 결과에 바인딩하고 싶습니다. 이런 식으로 뭔가 :IsEnabled 또는 IsVisible 속성을 메서드 또는 속성에 바인딩하는 방법은 무엇입니까?

public bool MyMethod() 
{ 
    return _valueA + _valueB == 2; 
} 

당신이 날은,이를 달성하기위한 적절한 방법을하시기 바랍니다 찾을 수 있습니다 :

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding MyMethod}"> 
    <!--Some other stuff--> 
</TabItem> 

뒤에 코드에서

?

들으, JiKra

+0

_valueA 및 _valueB는 어디에서 계산되며 언제 다시 계산해야합니까? –

+0

현재 클래스의 전역 변수가 될 수도 있고 외부 계산기 클래스가 할당 될 수도 있습니다. 중요하지 않습니다. IsEnabled 속성을이 메서드 나 클래스 속성에 바인딩하면됩니다. – JiKra

답변

3

당신은이 MultiBinding 사용해야 할 수도 있습니다 :

당신의 ViewModel에서
<TabItem Name="MyTab" Header="This should be enabled when result is 2"> 
    <TabItem.IsEnabled> 
    <MultiBinding Converter={StaticResource MyAddConverter}> 
     <Binding Path=ValueA UpdateSourceTrigger=PropertyChanged /> 
     <Binding Path=ValueB UpdateSourceTrigger=PropertyChanged /> 
    </MultiBinding> 
    </TabItem.IsEnabled> 
    <!--Some other stuff--> 
</TabItem> 

, 다음이 있어야합니다 (가정 당신의 ViewModel은 INotifyPropertyChanged를 구현) :

public double ValueA 
{ 
    get { return _valueA; } 
    set 
    { 
    _valueA = value; 
    OnPropertyChanged("ValueA"); 
    } 
} 

그리고 ValueB에 대해서도 WPF가 매번 Binding을 업데이트 할 수 있습니다.(210) 또는 ValueB

귀하의 변환은 다음과 같이한다 변경 :

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 
    double valueA = (double)values[0]; 
    double valueB = (double)values[1]; 
    return valueA + valueB == 2; 
} 

이 변경 할 때마다 ValueA 또는 VALUE (단위 : 십억)를 다시 호출 될 변환기에 정의 된 하나의 외부 방법을 가질 수 있도록한다.

나는 당신이 필요로하는 모든 것을 말하고 싶습니다. =)

+0

좋습니다, 이것은 정말 좋습니다. 나는 변환기에 대해 알고있다. 하지만 내 질문의 요점은 IsEnabled (또는 모든) 구성 요소의 속성을 로컬 메서드 또는 클래스 속성에 바인딩 할 수 있는지 여부입니다. valueA와 valueB는 관련이 없으며 단지 예일뿐입니다. 저는 WPF의 초보자입니다. 제발 저를 비난하지 마십시오. IsEnabled를 로컬 메소드 또는 클래스 속성에 바인딩하는 가장 간단한 방법을 보여줄 수 있습니까? 정말 더미 소품처럼 : public bool IsItEnabled() {return true; }? – JiKra

+0

일반적으로 속성에 바인딩 할 수 있습니다. 당신이 할 수있는 일은 다음과 같습니다 : 'public bool IsIsEnabled {get {return true; }}'그리고 그것은 당신이 필요로하는 것에 쉽게 맞을 것입니다. WPF에서 메서드에 바인딩하는 것이 좋습니다 (또는 바로 위의 해결 방법) 변환기를 사용하는 것입니다. 나는 그것을 할 수있는 몇 가지 방법이 있다고 생각하지만 변환기는 내가 필요로하고 유지하기가 더 쉽기 때문에 그것을 보지 않았다 – Damascus

+0

몇 가지 해결 방법이 여기에 나와있다 : http://stackoverflow.com/questions/502250/bind- to-a-method-in-wpf – Damascus

1

메서드에 직접 바인딩 할 수 없습니다. 재산이어야합니다. 그 말로는이 질문에 표시된 방법에 구속 할 수있는 다른 트릭이 있습니다. Bind to a method in WPF?.

위로 질문에, 내가 할 것이라고 MyMethod 속성을 만드는 것입니다.

public double SumAB 
{ 
    get{ return _valueA + _valueB;} 
} 

그런 다음 바인딩에 대한 변환기를 추가

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding SumAB, Converter={StaticResource SumValueToBoolConverter}}"> 

귀하의 변환 코드는 다음과 같습니다

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    double sumValue = (double)value; 
    if(sumValue==2) 
    { 
     return true; 
    } 
    return false; 
} 
2

당신은 당신이 값을 나타내는 새로운 속성을 만들 필요가 여기서 달성하려고 노력합니다. 이것은 뷰 모델의 전체 목적입니다. 나는 그것이 작동 할지라도 당신이 변환기를 여기에서 사용하는 것을 피하도록 강력하게 권고한다. 변환기는 뷰 전용 관심사를 처리하는 데 사용해야하지만 뷰 상태 관심사는 변환기입니다.

잠재적보기 모델은 다음과 같을 것이다 : (내가 사용하고 내 BindableBase)이 조금 자세한 보일지도 모르지만, 나는이에 대한 몇 가지 이유 강조하고 싶습니다

class AddingViewModel : BindableBase { 
    private int _valueA; 
    public int ValueA { 
     get { return _valueA; } 
     set { SetProperty(ref _valueA, value, "ValueA", OnValueAChanged); } 
    } 

    private void OnValueAChanged() { UpdateIsTabEnabled(); } 

    private int _valueB; 
    public int ValueB { 
     get { return _valueB; } 
     set { SetProperty(ref _valueB, value, "ValueB", OnValueBChanged); } 
    } 

    private void OnValueBChanged() { UpdateIsTabEnabled(); } 

    private bool _isTabeEnabled; 
    public bool IsTabEnabled { 
     get { return _isTabEnabled; } 
     private set { SetProperty(ref _isTabEnabled, value, "IsTabEnabled"); } 
    } 

    private void UpdateIsTabEnabled() { 
     IsTabEnabled = _valueA + _valueB == 2; 
    } 
} 

:

  • 요구 사항이 변경됨에 따라 UpdateIsTabsEnabled을 쉽게 찾고 변경할 수 있습니다.
  • ValueAValueB이 다른 기능의 구성 요소가되므로, 자신의 존경받는 방법 인 OnChanged에 후크를 쉽게 추가 할 수 있습니다.
  • IsTabEnabled을 원하는대로 IsEnabled 또는 Visibility 중 하나로 바인딩하는 것은 쉽습니다.
+0

변환기가 아닌 ViewModel에서 업데이트 조건을 갖는 것이 좋은 점. –

관련 문제