IValueConverterについて

IValueConverterについて、文字列をバインドしてIValueConverterで色に変換したものをバインドすることがあったのでメモ。

図のように色を変更するような場合に利用する。








色の情報は文字列や数値として保持し、バインドするときにSolidColorBrushに変換してからバインドするような場合に利用する。

CardBackgroundConverter.cs
   public class CardBackgroundConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string colorCode = (string)value;
            SolidColorBrush color =null;

            if(colorCode == "") { return null; }

            var alpha = System.Convert.ToByte(System.Convert.ToInt32(colorCode.Substring(1, 2), 16));
            var red = System.Convert.ToByte(System.Convert.ToInt32(colorCode.Substring(3, 2), 16));
            var green = System.Convert.ToByte(System.Convert.ToInt32(colorCode.Substring(5, 2), 16));
            var blue = System.Convert.ToByte(System.Convert.ToInt32(colorCode.Substring(7, 2), 16));

            color = new SolidColorBrush(Color.FromArgb(alpha, red, green, blue));

            return color;
        }

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

        #endregion
    }

使い方(一部抜粋)
<UserControl x:Class="TaskManager.controls.Card"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:TaskManager.controls"
             xmlns:converter="clr-namespace:TaskManager.converter"
             mc:Ignorable="d"
             Height="Auto" Width="250">
    <UserControl.Resources>
        <converter:CardBackgroundConverter x:Key="BackgroundConverter"/>
    </UserControl.Resources>

    <DockPanel Background="{Binding ColorCode,Converter={StaticResource BackgroundConverter}}"/>

</UserControl>

仕様変更などで色の種類が増えた場合にも、文字色の選択肢を増やすだけで対応が可能。
色以外にもVisibilityなどもIValueConverterで変換できる。
例)ある選択肢の値が1,2,5の時は別のコントロールを非表示。それ以外は表示など

正直慣れないうちは何をしているのかよくわからない。
慣れてくると段々、見るポイントが分かってくる。
デザイナをみてバインド時にValueConverterを指定していれば何の値(バインドされているプロパティの値)がそのコントロールの何のプロパティを変更しているかわかる、気がする。

0 件のコメント:

コメントを投稿

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...