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}
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, –
MultiDataTrigger kullanılır. SelectedIndex yapmak için> = 1 datatrigger '-1' için kopyalayın ve tetik değerini '0' olarak değiştirin. –