1. 程式人生 > >IValueConverter 資料格式化處理(二):MultiBinding的應用

IValueConverter 資料格式化處理(二):MultiBinding的應用

其內容主旨講的就是通過converter對資料進行轉化,變成另外的格式在Binding控制元件進行呈現。但是它只講解到了單條件的繫結,或者說只對ConverterParameter進行了常量的繫結。

那麼在特定功能情況下,上篇文章已經無法滿足,該文章將對上篇文章進行一個擴充套件的總結。

首先回顧一下converter的語法知識

cs檔案:

public class CommonMachineInfoImgConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//doSomething

}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

xaml檔案中:

首先引用:

<UserControl.Resources>
<local:CommonMachineInfoImgConverter x:Key="commonMachineInfoImgConverter" />

</UserControl.Resources>

然後對控制元件進行繫結:

NormalImage="{Binding Path=ActualSpeed,Converter={StaticResource commonMachineInfoImgConverter}}

Ok,但是如果我需要ConverterParameter也繫結實體類中的某個屬性可否,也許想到的第一實現方法可能是:

NormalImage="{Binding Path=ActualSpeed,Converter={StaticResource commonMachineInfoImgConverter},ConverterParmeter={Binding machinename}}

但是執行結果可以看出,這樣寫是不符合規範的。那麼本章節即將講解如何對此問題進行實現。

(一)Converter 多條件繫結屬性

cs檔案也會有些更改:

[ValueConversion(typeof(object), typeof(String))]
    public class TemperatureMiultiConverter : IMultiValueConverter
    {
        public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
        {
            //[0] temperature
            var valuebarValue = (int)value[0];
            var plantName = value[1] as string;
var plantConfigerInfo = DataManger.Instance.getPlantDataConfigerInfoByName(plantName);
            if (plantConfigerInfo != null)
            {
                var minWarning = plantConfigerInfo.PlantTemperature.MinWarning;
                var maxWarming = plantConfigerInfo.PlantTemperature.MaxWarning;
                return valuebarValue > int.Parse(maxWarming) || valuebarValue < int.Parse(minWarning) ? GlobalValue.ValueBarImgWarnning : GlobalValue.TemperatureImgNormal;
            }
            return GlobalValue.TemperatureImgNormal;
        }

        public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException("ConcatenateFieldsMultiValueConverter cannot convert back (bug)!");
        }
    }

xaml檔案

   <Controls:ValueBar.NormalImage>
                    <MultiBinding Converter="{StaticResource commonMachineConverter}"
                                  ConverterParameter="B">
                        <Binding Path="ActualProcessInput" />
                        <Binding Path="Name" />
                    </MultiBinding>
   </Controls:ValueBar.NormalImage>

MultiBinding 屬於多條件繫結,即有效的解決了多條件繫結的困擾,並且IMultiValueConverter可以接收和返回。

(二)convert多條件繫結屬性為類的區域性變數,並非實體類中的屬性

我們很容易想到binding不僅僅可以繫結實體類的屬性,也可以繫結控制元件的屬性通過ElementName屬性。

那麼在頁面上新建一個控制元件,<TextBlock x:Name="tbName" Visibility="Collapsed" />

然後在後臺後臺對tbName進行繫結賦值,如程式碼:machinename.Text = MachineName;

xaml檔案,多條件繫結程式碼:

   <Controls:ValueBar.NormalImage>
                    <MultiBinding Converter="{StaticResource commonMachineConverter}"
                                  ConverterParameter="D">
                        <Binding Path="SpindlePower" />
                        <Binding Path="Text"
                                 ElementName="machinename" />
                    </MultiBinding>
    </Controls:ValueBar.NormalImage>
當然,ConverterParameter的使用和單條件繫結相同

OK,到現在為止,我們需求已經完全能夠得到實現。這裡只是對MultiBinding 進行一個整理,希望對有需要的同學們有所幫助