IMultiValueConverter and IValueConverter : IValueConverter « Windows Presentation Foundation « C# / CSharp Tutorial






<Window x:Class="ColorConverter.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:ColorConverter"
    Title="Colors" Height="300" Width="300">
  <Window.Resources>
    <local:ColorMultiConverter x:Key="colorConverter"/>
    <local:ColorNameValueConverter x:Key="colorNameConverter"/>
  </Window.Resources>
  <Grid>
    <Label Name="label1" Width="39">Red:</Label>
    <Slider Name="redSlider" VerticalAlignment="Top" Maximum="255" />
    <Label Name="label2">Green:</Label>
    <Slider Name="greenSlider" Maximum="255" />
    <Label Name="label3">Blue:</Label>
    <Slider Name="blueSlider" Maximum="255" />
    <Grid Name="colorBlock" >
        <Grid.Background>
          <SolidColorBrush>
            <SolidColorBrush.Color>
              <MultiBinding Converter="{StaticResource colorConverter}">
                <Binding ElementName="redSlider" Path="Value"/>
                <Binding ElementName="greenSlider" Path="Value"/>
                <Binding ElementName="blueSlider" Path="Value"/>
              </MultiBinding>
            </SolidColorBrush.Color>
          </SolidColorBrush>
        </Grid.Background>
        <Label Name="label4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" >
          <Label.Foreground>
            <SolidColorBrush>
              <SolidColorBrush.Color>
                <MultiBinding Converter="{StaticResource colorConverter}" ConverterParameter="inverse">
                  <Binding ElementName="redSlider" Path="Value"/>
                  <Binding ElementName="greenSlider" Path="Value"/>
                  <Binding ElementName="blueSlider" Path="Value"/>
                </MultiBinding>
              </SolidColorBrush.Color>
            </SolidColorBrush>
          </Label.Foreground>
          <Label.Content>
            <PriorityBinding FallbackValue="Unknown">
              <Binding ElementName="colorBlock" Path="Background.Color" Converter="{StaticResource colorNameConverter}"/>
              <Binding ElementName="colorBlock" Path="Background.Color"/>
            </PriorityBinding>
          </Label.Content>
        </Label>
    </Grid>
  </Grid>
</Window>

//File:Window.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Windows;
using System.Reflection;


namespace ColorConverter
{
  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
    }

    private void colorBlock_MouseDown(object sender, MouseButtonEventArgs e)
    {
      Random rnd = new Random((int)DateTime.Now.Ticks);

      Color newColor = Color.FromRgb((byte)rnd.Next(255), (byte)rnd.Next(255), (byte)rnd.Next(255));
      colorBlock.Background = new SolidColorBrush(newColor);
    }
  }
  class ColorMultiConverter : IMultiValueConverter
  {

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      bool inverse = (parameter != null) && (string.Compare(parameter.ToString(), "inverse", true) == 0);

      byte R = System.Convert.ToByte((double)values[0]);
      byte G = System.Convert.ToByte((double)values[1]);
      byte B = System.Convert.ToByte((double)values[2]);

      Color newColor;
      if (inverse)
        newColor = Color.FromRgb((byte)(255 - R), (byte)(255 - G), (byte)(255 - B));
      else
        newColor = Color.FromRgb(R, G, B);

      return newColor;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
      Color oldColor = (Color)value;
      double R = (double)oldColor.R;
      double G = (double)oldColor.G;
      double B = (double)oldColor.B;

      return new object[] { R, G, B };
    }

  }

  class ColorNameValueConverter : IValueConverter
  {
    private Dictionary<Color, string> namedColors = new Dictionary<Color, string>();

    public ColorNameValueConverter()
    {
      PropertyInfo[] colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public);
      Color stepColor;
      foreach (PropertyInfo pi in colorProperties)
      {
        if (pi.PropertyType == typeof(Color))
        {
          stepColor = (Color)pi.GetValue(null, null);
          namedColors[stepColor] = pi.Name;
        }
      }
    }
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      Color col = (Color)value;
      if(namedColors.ContainsKey(col))
        return namedColors[col];
      return DependencyProperty.UnsetValue;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }  
}
WPF I Multi Value Converter And I Value Converter








24.146.IValueConverter
24.146.1.IMultiValueConverter and IValueConverterIMultiValueConverter and IValueConverter
24.146.2.Decimal ScrollBar Window with extending IValueConverterDecimal ScrollBar Window with extending IValueConverter
24.146.3.Extend IValueConverter to create your own converterExtend IValueConverter to create your own converter
24.146.4.Debug Data Bindings Using an Empty IValueConverterDebug Data Bindings Using an Empty IValueConverter
24.146.5.Use LengthConverterUse LengthConverter