我有一个C#WPF 4.51应用程序。在我的一个XAML表单上,我有一个列表框,其 ItemsSource 属性绑定到我的主 ViewModel 中属性为 Collection 的属性。当Collection的类型为 string 时,一切正常,我在列表框中看到了字符串集合。
但后来我将Collection中的类型更改为名为 ObservableStringExt 的类。该类有两个字段: StrItem ,其中包含我希望在列表框中显示的字符串,以及 IsSelected ,一个支持字段。然后我创建了一个值转换器来提取StrItem字段并将其返回。
但是,当我查看传递给值转换器的Convert()方法的targetType时,我看到了 IEnumerable 的类型。鉴于该参数中的 Count 属性与预期的列表项数相匹配,看起来Convert()方法接收对整个Collection的引用 ObservableStringExt ,集合中每个项目的类型。这当然是个问题。是什么造成的?我已经多次在Windows Phone和WinRT(windows商店应用程序)中做过很多次这样的事情而没有遇到任何麻烦。
以下是值转换器的代码:
public class ObservableStringExtToStrItem : IValueConverter
{
// The targetType of the value received is of type IEnumerable, not ObservableStringExt.
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is ObservableStringExt)
return (value as ObservableStringExt).StrItem;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
下面是列表框的XAML代码。注意 Commands_FrequentyUsed 是主视图模型中的 ObservableCollectionWithFile 类型的属性,它是整个表单的数据上下文:
<ListBox x:Name="listFrequentlyUsedCommands"
Width="278"
Height="236"
Margin="30,103,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemsSource="{Binding Commands_FrequentyUsed.Collection,
Converter={StaticResource ObservableStringExtToStrItem}}" />
以下是包含列表框绑定的Collection和Collection包含的类的类的代码:
public class ObservableStringExt
{
public string StrItem { get; set;}
public bool IsSelected{ get; set; }
}
public class ObservableCollectionWithFile : BaseNotifyPropertyChanged
{
public const string CollectionPropertyName = "Collection";
private ObservableCollection<ObservableStringExt> _observableCollection = new ObservableCollection<ObservableStringExt>();
public ObservableCollection<ObservableStringExt> Collection
{
get { return _observableCollection; }
private set { SetField(ref _observableCollection, value); }
}
} // public class ObservableCollectionWithFile
答案 0 :(得分:0)
我只是遇到了同样的问题。不确定如何正常工作,但是将转换器更改为也转换项目列表很有帮助(我发现这比为List创建单独的转换器更容易)
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var list = value as IEnumerable<ObservableStringExt>;
if (list != null)
{
return list.Select(x => Convert(x, typeof(string), null, culture));
}
if (value is ObservableStringExt)
return (value as ObservableStringExt).StrItem;
}