2010-05-26 20 views
9

myObject.SelectedIndex >= 0 gibi bir koşul için IsEnabled özelliğini bir düğüme bağlamak istiyorum. Xaml'de bunu yapmak için basit bir yol var mı? (Herhangi bir temel nesneye çılgın şeyler yapmak zorunda kalmadan)? Gerçekten iyi bir örnek görmedim.WPF Koşullu Bağlama. SelectedIndexEnabledEnabled> = 0

Açıkçası, yani .:

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

cevap

16

Selectedındex doğru, ... Bu Flex 3 kadar kolay oldu -1 şey seçili eğer arzu? işte bunun yerine kullanıyorum buydu

<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

Teşekkürler, bunu düğmelerimden biri için kullanabilirim, ancak diğeri ise SelectedIndex> = 1 olabilir. Bunu yukarıdaki örneğiniz gibi yapabilirim ama sadece bir MultiDataTrigger ile yapabilir miyim? Koşullar birlikte ve eklendiğinde, –

+1

MultiDataTrigger kullanılır. SelectedIndex yapmak için> = 1 datatrigger '-1' için kopyalayın ve tetik değerini '0' olarak değiştirin. –

2

ben XAML içine bir ifade gömmek için özellikle kolay kullanımlı bir yol bulamadı: mantık Ters ve bir tetikleyici kullanmak

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

Bunu C# 'de yazmak zorundasınız, örneğin pencerenin yapıcısında.

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 
)); 

lambda statik olarak yazılır gözlemleyin ve her tür hatalar onları izini yardımcı (nispeten) gürültülü şunlardır:

Bu aynı zamanda çok kaynaklı bağlamaları için sorunsuz çalışır. Lambda dönüş tipi de dikkate alınır; Bir nesnenin genişliğini, diğerinin genişliğini temel alan karmaşık bir formül olması için bunu kullanabilirsiniz ...

Bu LambdaBinding sınıfı yerleşik değildir; LambdaBinding.cs dosyasını eklemelisiniz. Yan not:

Yan not. XAML'nin ifadelere izin vermemesi gerçekten utanç verici. Evet, XAML'nin "tasarımcılar için" olması gerektiğini ve uygulama mantığını olarak adlandırdığımız bu zor şeyden arınmış olduğunu farkettim, ama burada kimi şaka yapıyoruz ... Öncelikle, diğer cevapta gösterilen DataTrigger temel olarak bir koşullu ifadedir. ve böylece {Binding source.SelectedIndex >= 0}'dan farklı (yalnızca çok daha uzun). İkincisi, eğer fikir basitse, bir tasarımcının yazabileceği varsayılan ifadeler, programcı olmayanların yeteneklerinin çok ötesindedirler. Eğer bir provaya ihtiyacınız varsa, şunun gibi bir şeye dikkat edin:

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