2010-05-26 9 views
9

버튼 IsEnabled 속성을 myObject.SelectedIndex >= 0과 같은 조건으로 바인딩하려고합니다. xaml에서이 작업을 수행하는 간단한 방법이 있습니까 (기본 객체에 미친 짓을하지 않고도)? 나는 정말로 좋은 본을 보지 못했다.WPF 조건부 바인딩. Button.IsEnabled to SelectedIndex> = 0

솔직히, 즉 :

<mx:Button enabled="{dataGrid.SelectedIndex >= 0}" ... 

답변

16

selectedIndex의 오른쪽 ...이 플렉스 3만큼 쉬웠다 -1 아무것도 선택되어 있지 않다면 소원? 그래서 여기에 내가 대신 사용하고 무엇을,

<Button ...> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="enabled" Value="True" /> 

      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding SelectedIndex,ElementName=dataGrid}" 
        Value="-1"> 

        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Button.Style> 
<Button> 
+0

고마워, 내 단추 중 하나에 사용할 수 있지만 다른 하나는 SelectedIndex> = 1이 될 것입니다. 위의 예제처럼 MultiDataTrigger를 사용할 수 있습니까? –

+1

조건을 함께 사용하면 MultiDataTrigger가 사용됩니다. SelectedIndex> = 1을 수행하려면 '-1'에 대한 데이터 트리거를 복사하고 트리거 값을 '0'으로 변경하십시오. –

2

내가 XAML에 표현식을 포함하는, 특히 사용하기 쉬운 방법을 발견하지 않은 : 당신의 논리를 반전하고 트리거를 사용

BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
    new Binding { Source = myObject, 
        Path = new PropertyPath(ComboBox.SelectedIndexProperty) }, 
    (int selectedIndex) => selectedIndex >= 0 
)); 

C#으로 작성해야합니다 (예 : 창 생성자).

BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
    new Binding { Source = myObject, 
        Path = new PropertyPath(ComboBox.SelectedIndexProperty) }, 
    new Binding { Source = myObject2, 
        Path = new PropertyPath(Button.ActualHeightProperty) }, 
    (int selectedIndex, double height) => selectedIndex >= 0 && height > 10.5 
)); 

는 람다가 정적으로 입력 된 것을 관찰하고, 모든 유형의 오류는 해당 오류를 추적 돕고, (상대적으로) 시끄러운 :

이것은 또한 멀티 - 소스 바인딩을 위해 완벽하게 작동합니다. 람다 반환 형식 또한 고려됩니다. 이 값을 사용하여 하나의 객체의 폭을 다른 객체의 너비를 기반으로하는 복잡한 수식으로 바인딩 할 수 있습니다 ...

LambdaBinding 클래스는 내장되어 있지 않습니다. 당신은 LambdaBinding.cs 파일을 포함해야합니다.

사이드 노트. XAML에서 식을 허용하지 않는 것이 현명합니다. 예, XAML이 "디자이너 용"으로되어 있고 응용 프로그램 논리 인이라고 부르는이 어려운 항목이 없지만 여기에서 우리는 농담하는 사람이 누구입니까 ... 첫째, 다른 대답에 표시된 DataTrigger은 기본적으로 조건부 표현식입니다. (많은 만) {Binding source.SelectedIndex >= 0}보다 길지 않습니다. 둘째로 아이디어가 단순하다면 설계자가 작성할 수있는 바인딩 표현식은 프로그래머가 아닌 사람의 능력을 훨씬 뛰어 넘습니다. 증명이 필요한 경우 다음과 같이 고려하십시오.

{Binding RelativeSource={RelativeSource AncestorType={x:Type UIElement}, 
             AncestorLevel=1}, 
     Path=IsEnabled}