[英]WPF ComboBox Binding with Converter
好的,這是交易。 我有一個CollectionViewSource:
<CollectionViewSource x:Key="PA_System_AppStatus">
<CollectionViewSource.Source>
<SystemCols:ArrayList>
<ComboBoxItem Content="Active" />
<ComboBoxItem Content="Denied" />
<ComboBoxItem Content="Granted" />
</SystemCols:ArrayList>
</CollectionViewSource.Source>
</CollectionViewSource>
我還有一個綁定到該框的ComboBox:
<ComboBox x:Name="Perro" Tag="Application"
SelectedValue="{Binding Path=[AppStatus], Converter={StaticResource AppStatusConverter}}"
ItemsSource="{Binding Source={StaticResource PA_System_AppStatus2}}"/>
AppStatus是DataRow中的一個字符,可以是A,D,G。 因此,我希望ComboBox在上方顯示整個ComboBoxItem,但在底層存儲char。 為此,我編寫了這個Converter:
public class AppStatusConverter : IValueConverter
{
public object Convert(
object value,
System.Type targetType,
object parameter,
System.Globalization.CultureInfo culture
)
{
string returnValue = null;
if (value != System.DBNull.Value && value != null)
{
if ((string)value == "A")
returnValue = "Active";
else if ((string)value == "D")
returnValue = "Denied";
else if ((string)value == "G")
returnValue = "Granted";
else
returnValue = null;
}
return returnValue;
}
public object ConvertBack(
object value,
System.Type targetType,
object parameter,
System.Globalization.CultureInfo culture
)
{
string returnValue = null;
string tempvalue = ((ComboBoxItem)value).Content.ToString();
if (tempvalue == "Active")
returnValue = "A";
else if (tempvalue == "Denied")
returnValue = "D";
else if (tempvalue == "Granted")
returnValue = "G";
else
returnValue = null;
return returnValue;
}
}
ConvertBack部分可以完美工作,並且每當我選擇一個值時,DataRow就會被填充其中一個字符(A,D或G)。
但是,轉換沒有。 例如,我從數據庫加載DataRow。 然后,轉換器將正確地獲取“ AppStatus”列中的值,並嘗試將其轉換為選擇ComboBox項之一並分配SelectedValue。 但是,什么也沒有發生。
似乎問題是您正在從轉換器返回一個字符串值,但是ItemsSource
是一個用ComboBoxItems填充的ArrayList
,因此它將檢查引用是否相同。 嘗試使用字符串值而不是ComboBoxItems填充ArrayList
。 您可以為此使用普通的字符串數組:
<x:Array Type="sys:String">
<sys:String>Active</sys:String>
<sys:String>Denied</sys:String>
<sys:String>Granted</sys:String>
</x:Array>
在其中添加系統名稱空間的位置: xmlns:sys="clr-namespace:System;assembly=mscorlib"
然后可以按如下所示簡化轉換器:
兌換:
{
if (!(value is char)) return null;
char c = (char)value;
switch (c)
{
case 'A': return "Active";
case 'D': return "Denied";
case 'G': return "Granted";
}
return null;
}
ConvertBack:
{
string sVal = value as string;
if (string.IsNullOrEmpty(sVal)) return null;
switch (sVal)
{
case "Active": return 'A';
case "Denied": return 'D';
case "Granted": return 'G';
}
return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.