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 進行一個整理,希望對有需要的同學們有所幫助