簡體   English   中英

XAML Int到布爾轉換器

[英]XAML Int to boolean converter

我需要創建帶條件的MultiDataTrigger來檢查我的ObservableCollection Count屬性是否<> 0。

所以我想將我的集合的Count值轉換為boolean。

我怎樣才能做到這一點?

就像是:

<Condition Binding="{Binding Path=MyCollection.Count, Converter=Int32CollectionConverter, ConverterParameter=<what should be there?>}" Value="true" />

你所要求的是在正確的軌道上,我自己就是那種轉換器。 這是我如何使用它的一個例子(我已經清理了一些代碼):

<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}" d:DataContext="{d:DesignInstance mynamespace:myDataObject, d:IsDesignTimeCreatable=False}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding   
                               Path=ChildMenuItems.Count,   
                               Converter={mynamespace:NumericComparisonToBoolConverter   
                                          ComparisonNumber=0,  
                                          ComparisonType=IsGreaterThan
                                          }}"  
                     Value="true" 
                     >
            <Setter Property="Padding" Value="3,1,7,1"/>
            <Setter Property="Template" Value="{StaticResource someRandomTemplate}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

如果它具有子菜單項,則會在頂級菜單項上設置幾個屬性。

我將把轉換器的內容作為練習留給你,但這里有一個粗略的大綱讓你開始:

public class NumericComparisonToBoolConverter : MarkupExtension, IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && IsNumericType(value.GetType()))
        {
            var d = System.Convert.ToDouble(value);

            switch (ComparisonType)
            {
                case NumericComparisonType.IsEqualTo:
                    return ComparisonNumber == d;

                ...etc...
            }
        }

        return false;
    }

    public double ComparisonNumber { get; set; }

    public NumericComparisonType ComparisonType { get; set; }

    public enum NumericComparisonType
    {
        None = 0,
        IsEqualTo,
        IsNotEqualTo,
        IsLessThan,
        IsGreaterThan,
        ...etc...
    }

    protected bool IsNumericType(Type type)
    {
        if (type == null)
            return false;
        switch (Type.GetTypeCode(type))
        {
            case TypeCode.Byte:
            case TypeCode.Decimal:
            case TypeCode.Double:
            ...etc...
                return true;
            case TypeCode.Object:
                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    return IsNumericType(Nullable.GetUnderlyingType(type));
                }
                return false;
        }
        return false;
    }

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

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

}

創建MultiValue轉換器:

public class MyMultivalueConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //write your conversion code here
        //values[0] will be the count of your collection as that is first supplied value in MultiBinding
        return true;
    }

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

並在XMAL中的MultiBinding中使用該轉換器:

 <local:MyMultivalueConverter x:Key="Converter" />
    <MultiBinding Converter="{StaticResource Converter}">
        <Binding RelativeSource="{RelativeSource AncestorType={x:Type YourItemControl}}" Path="dataContext.Collection.Count"/>
        .........
        other conditions
    </MultiBinding>

這個多值轉換器正在返回一個bool ,所以無論你想要什么條件都將它傳遞給轉換器,它會給你一個bool值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM