WPF’te sıkça kullandığımız Value Converter’lardan buradaki yazımızda bahsetmiştik. Hatta istersek value convertera parametre gönderip bu parametreye göre dönüştürme işlemlerini de gerçekleştirebiliriz.

<Rectangle Width="200" Height="200" Fill="Red" Visibility="{Binding ElementName=cbVisible,Path=IsChecked,Converter={StaticResource boolToVisibilityConverter},ConverterParameter=True}"/>  

Yukarıdaki kod bloğunda ConverterParameter’a parametre olarak True göndermiş olduk. IValueConverter arayüzünü implemente eden sınıfımızın Convert metodunda, göndermiş olduğumuz bu parametreyi parameter değişkeninden alabiliyoruz. Dikkat ettiyseniz parametremiz object tipinden, bu da demek oluyor ki istediğimiz tipte değeri parametre olarak gönderebiliriz.

Bu kadar girişten sonra gelelim asıl konumuza. Diyelim ki parametre olarak bir elementin o anki değerini gönderip, o değere göre convert işleminin olmasını istiyoruz. İlgili data binding işlemlerini yapıp çalıştırdığımızda şöyle bir hata ile karşılaşıyoruz:

A 'Binding' cannot be set on the 'ConverterParameter' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

Hatadan da anlaşılacağı gibi ConverterParameter özelliğine Dependency Property olmadığı için data binding işlemi gerçekleştiremiyoruz. Bunu gerçekleştirmenin yolu MultiBinding kullanmak olacaktır. Hemen yazımızın başındaki kodumuzu MultiBinding kullanarak tekrar düzenliyoruz.

<Rectangle Width="200" Height="200" Fill="Red">  
            <Rectangle.Visibility>
                <MultiBinding Converter="{StaticResource boolToVisibilityConverter}">
                    <MultiBinding.Bindings>
                        <Binding ElementName="cbVisible" Path="IsChecked"/>
                        <Binding Path="State"/>
                    </MultiBinding.Bindings>
                </MultiBinding>
            </Rectangle.Visibility>
        </Rectangle>

Multibinding kullandığımız için yazmış olduğumuz value converter’da da değişiklik yapmamız gerekiyor. Çünkü multibinding ile göndermiş olduğumuz birden fazla değerin converter tarafında tekrar ele alınması gerekecektir. Bu yüzden IValueConverter arayüzü yerine IMultiValueConverter kullanmamız gerekiyor.

public class BoolToVisibilityConverter : IMultiValueConverter  
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var boolValue = (bool)values[0];
        var state = values[1].ToString();
        if (state.Equals("Collapse"))
            return Visibility.Collapsed;
        else
            return boolValue ? Visibility.Visible : Visibility.Hidden;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("Not implemented");
    }
}

Kod bloğunu incelediğimizde bind edilen tüm değerler Convert metoduna object tipinden bir dizi olarak geldiğini görmekteyiz. Böylece ConverterParameter ‘a her ne kadar binding işlemi yapamasak da MultiBinding mekanizması sayesinde aynı işlevi gerçekleyebiliriz.

About the Author