2009-10-20 18 views
34

Booleanın değerine bağlı olarak göstermek/gizlemek istediğim bir kontrol var.WPF: 1 ciltlemede 2 dönüştürücü nasıl kullanılır?

NegatedBooleanConverter'im var (false değerine doğru ve tam tersi) ve bu dönüştürücüyü önce çalıştırmam gerekiyor. BooleanToVisibilityConverter kullanıyorum ve bu dönüştürücüyü NegatedBoolConverter'den sonra çalıştırmam gerekiyor.

Bu sorunu nasıl düzeltebilirim? Bunu XAML'de yapmak istiyorum.

düzenleme: çalışmak görünmüyor this is a possible solution.

. İlk önce değeri ayrı dönüştürücülerle dönüştürür ve sonra dönüştürülmüş değerler ile bir şeyler yapar.

Benim ihtiyacım olan:

  • (bu convertedValue verir) ilk konvertörlü değerini dönüştürün.
  • ConvertedValue'ı ikinci dönüştürücüye dönüştürün ve buna ihtiyacım var.
+0

evet, bağlandığınız çözüm muhtemelen en iyisi ... –

+0

Ayrıca bakınız [XAML'de çoklu dönüştürücüler zincirleme] (http://stackoverflow.com/q/2607490/2032064) – Mifeet

+0

Kasaba en iyisi dedi [burada] (http://stackoverflow.com/a/8326207/526704), onun çözüm jberger cevabı benzer, istediğiniz kadar birçok zincir sağlar, ancak bu bir daha zarif ve kısa uygulanmasında ise – DLeh

cevap

0

Sadece temelde bu 2 sizin için ancak tek adımda ne yapacağını yapmak ReversedBooleanToVisibilityConverter denilen kadarıyla oluşturduk.

+0

Evet, bu olası olur Çözüm, ancak mevcut dönüştürücülerimi tekerleği yeniden icat etmeden yeniden kullanabileceğim bir çözüm tercih ediyorum. Bu çözüm varsa ... – Natrium

0

Bu sorunu çözmek için, iki dönüştürücü kullanmak yerine, özgün Boolean'ın devre dışı bırakılıp bırakılmayacağını belirlemek için ConverterParameter'ı (boole olarak) kullanan kendi BoolToVisibilityConverter yazabilirsiniz.

+0

Evet, ama ben tekerleği yeniden icat etmek zorunda kalmadan benim şimdiki dönüştürücüleri yeniden kullanabilirsiniz bir çözüm olası bir çözüm tercih ettiğinizi belirtir. Bu çözüm varsa ... – Natrium

0

Şahsen tam dönüşümü yapan tek bir dönüştürücü yapıyorum. Eğer dönüştürücülere (negatifleştirme gibi) başka yerlerde umutsuzca ihtiyaç duymadıkça, dönüşüm bir kez yapıldıysa, tek bir yerde (imo) bakımın yapılması daha kolay olacaktır.

+1

Evet, ama ben tekerleği yeniden icat etmek zorunda kalmadan benim şimdiki dönüştürücüleri yeniden kullanabilirsiniz bir çözüm olası bir çözüm tercih ettiğinizi belirtir. Bu çözüm varsa ... – Natrium

0

Burada iki ayrı dönüştürücü yerine bir Çok Dönüştürücü kullanmak isteyebilirsiniz. Mantığı mevcut dönüştürücülerinizden yeniden kullanabilmeniz gerekir. Bir başlangıç ​​için this discussion'a bakın.

3

Projemizde yaptığımız şey, düzenli bir BooleanToVisibilityConverter yapmasıdır, çünkü dönüştürücü bir parametre alır (bir şey, bir dizi, bir int, bool, her neyse). Parametre ayarlanırsa, sonucu tersine çevirir, eğer değilse, normal sonucu çıkarır.

public class CombiningConverter : IValueConverter 
    { 
     public IValueConverter Converter1 { get; set; } 
     public IValueConverter Converter2 { get; set; } 

     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      object convertedValue = Converter1.Convert(value, targetType, parameter, culture); 
      return Converter2.Convert(convertedValue, targetType, parameter, culture); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 

ve böyle diyoruz:

public class BooleanToVisibilityConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool? isVisible = value as bool?; 
     if (parameter != null && isVisible.HasValue) 
      isVisible = !isVisible; 
     if (isVisible.HasValue && isVisible.Value == true) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 

    #endregion 
} 
+1

Bu dönüştürücü xaml olarak nasıl aranır? – Natrium

49

Bu benim yaptığım budur

<converters:CombiningConverter x:Key="negatedBoolToVisibilityConverter" Converter1="{StaticResource NegatedBooleanConverter}" Converter2="{StaticResource BoolToVisibilityConverter}" /> 

A MultiValueConverter da bence mümkün olabilir. Belki sonra deneyeceğim.

+0

Bu güzel ... – MoonKnight

23

Natrium'un büyük yanıtını genişletmek ...

XAML Bu durumda

<conv:ConverterChain x:Key="convBoolToInverseToVisibility"> 
    <conv:BoolToInverseConverter /> 
    <BooleanToVisibilityConverter /> 
</conv:ConverterChain> 

Sınıf

/// <summary>Represents a chain of <see cref="IValueConverter"/>s to be executed in succession.</summary> 
[ContentProperty("Converters")] 
[ContentWrapper(typeof(ValueConverterCollection))] 
public class ConverterChain : IValueConverter 
{ 
    private readonly ValueConverterCollection _converters= new ValueConverterCollection(); 

    /// <summary>Gets the converters to execute.</summary> 
    public ValueConverterCollection Converters 
    { 
     get { return _converters; } 
    } 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converters 
      .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converters 
      .Reverse() 
      .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); 
    } 

    #endregion 
} 

/// <summary>Represents a collection of <see cref="IValueConverter"/>s.</summary> 
public sealed class ValueConverterCollection : Collection<IValueConverter> { } 
+3

Bu [makale] (http://www.codeproject.com/KB/WPF/PipingValueConverters_WPF.aspx) 'ın çözüm çalışma zamanı tip denetimine sağlar. –

+1

Bu, yanlış targetType dönüştürücülerine geçer. Hedef targetType'ı, açılış sorusunun senaryosunda bile yanlış olan tüm dönüştürücülere iletecektir. TargetType aslında "bool" olduğunda, "Görünürlük" türü ilk dönüştürücüye iletilir. – CodePB

3

, bir dönüştürücü zincirini gerekmez. Sadece yapılandırılabilir bir dönüştürücüye ihtiyacınız var. Bu, yukarıdaki Carlo'nun yanıtına benzer, ancak doğru ve yanlış değerleri açıkça tanımlar (yani, aynı dönüştürücüleri Gizli, Görünür veya Çöken dönüşümler için kullanabilirsiniz). Sonra XAML

[ValueConversion(typeof(bool), typeof(Visibility))] 
public class BoolToVisibilityConverter : IValueConverter 
{ 
    public Visibility TrueValue { get; set; } 
    public Visibility FalseValue { get; set; } 

    public BoolToVisibilityConverter() 
    { 
     // set defaults 
     FalseValue = Visibility.Hidden; 
     TrueValue = Visibility.Visible; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (bool)value ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

:

<BoolToVisibilityConverter x:Key="BoolToVisibleConverter" 
           FalseValue="Hidden" 
           TrueValue="Visible" /> 
+1

XAML 2009'u kullanabiliyorsanız, bu jeneriği de yapabilirsiniz. 'Dönüştürücü = {c: BooleanConverter (Görünürlük) Doğru = Görünür, Yanlış = Daraltılmış} sözdizimi Özellik' eleman sözdizimi: '' Eğer XAML 2009 kullanamıyorsanız , hala temel sınıf jenerik yapabilir ancak her jenerik türü için beton türetilmiş sınıfları gerekir. –