[英]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.