2015-05-22 7 views
2

Я разработал индикатор уровня заряда батареи, состоящий из границы внутри другой границы. Ширина внутренней границы Мульти-Bound к внешней границе ActualWidth и само значение батареи (от DataContext, в пределах от 0,0 до 1,0):Установить элемент Фон на основе значения, возвращаемого MultiValueConverter - Как это сделать?

<Border x:Name="BatteryChargeContainer"> 
    <Border x:Name="BatteryCharge" Margin="1" HorizontalAlignment="Left" Background="Gray"> 
      <Border.Width> 
       <MultiBinding Converter="{StaticResource NormalValueConverter}" FallbackValue="10"> 
        <Binding Path="BatteryLevel"/> 
        <Binding Path="ActualWidth" ElementName="BatteryChargeContainer"/> 
       </MultiBinding> 
      </Border.Width> 
     </Border> 
</Border> 

============ ======

class NormalValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values.Any(v => v == null)) 
      return null; 
     var v1 = values[0]; 
     var v2 = values[1]; 

     double valor = System.Convert.ToDouble(v1); 
     double measure = System.Convert.ToDouble(v2); 

     return valor * measure; 
    } 

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

Теперь я хочу сделать что-то подобное для Background собственности, с другой IMultiValueConverter. Цвет должен быть рассчитан следующим образом:

  • Зеленый, если выше 0,8;
  • Желтый между 0,6 и 0,8;
  • Оранжевый - от 0,3 до 0,6;
  • Красный, если ниже 0,3.

Эти цвета определяются как ресурсы, потому что я абсолютно не хочу объявить их в коде, поэтому мой вопрос:

Если цвета определяются как ресурсы, и фактический применяемый цвет рассчитывается в конвертере MultiBind, как я могу применить цвет на основе возвращаемого значения, или же MultiConverter оценивает доступные цвета и возвращает выбранный цвет сам?

+0

Есть ли причина, по которой вы абсолютно хотите использовать MultiValueConverter? Потому что вы можете сделать это с помощью триггеров непосредственно в xaml. – mgarant

+0

@mgarant Нет, нет абсолютной причины, вот что я подумал, что должен делать, но я думаю, что вы правы, хотя я не уверен, что знаю, с чего начать ... Если вы хотите отправить ответ, я могу согласиться это, конечно :) В частности, я не знаю, как триггер обнаружил бы, если значение находится между заданным диапазоном. – heltonbiker

+0

Я напишу вам пример :) – mgarant

ответ

2

Вы можете использовать триггеры с конвертером. Преобразователь вернет значение true, если значение больше заданного числа. Вот пример:

<Border x:Name="BatteryChargeContainer"> 
    <Border x:Name="BatteryCharge" Margin="1" HorizontalAlignment="Left" Background="Gray"> 
     <Border.Style> 
      <Style TargetType="Border"> 
       <Setter RED.../> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding yourBinding, Converter=theConverter, ConverterParameter=0.3}" Value="true"> 
         <Setter ORANGE... /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding yourBinding, Converter=theConverter, ConverterParameter=0.6}" Value="true"> 
         <Setter YELLOW... /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding yourBinding, Converter=theConverter, ConverterParameter=0.8}" Value="true"> 
         <Setter GREEN... /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Border.Style> 
    </Border> 

Это должно работать, потому что все триггеры будут проверены в порядке. Например, если вы загружаете значение 0.9, оно будет возвращать true на каждом триггере, поэтому оно изменит цвет на оранжевый, затем желтый, а затем зеленый, так что в результате вы получите зеленый цвет.

Маленькая, но значительная деталь, в вашем конверторе параметр, который вы получите, будет строкой. Вам нужно будет отправить его в поплавок, прежде чем вы проверите его со значением.

Надеюсь, это поможет!

+0

Красивый. Собираюсь проверить это прямо сейчас. Благодаря! – heltonbiker

 Смежные вопросы

  • Нет связанных вопросов^_^