C#WPF值转换器接收整个集合而不是单个项作为值参数?

C#WPF值转换器接收整个集合而不是单个项作为值参数?,c#,wpf,xaml,data-binding,ivalueconverter,C#,Wpf,Xaml,Data Binding,Ivalueconverter,我有一个C#WPF4.51应用程序。在我的一个XAML表单上,我有一个列表框,它的ItemsSource属性绑定到我的主ViewModel中属于Collection类型的属性。当集合的类型为string时,一切正常,我在列表框中看到了字符串集合 但后来我将集合中的类型更改为名为observatestringext的类。该类有两个字段:StrItem,其中包含我希望在列表框中显示的字符串;以及IsSelected,一个支持字段。然后我创建了一个值转换器来提取StrItem字段并返回它 但是,当我查

我有一个C#WPF4.51应用程序。在我的一个XAML表单上,我有一个列表框,它的ItemsSource属性绑定到我的主ViewModel中属于Collection类型的属性。当集合的类型为string时,一切正常,我在列表框中看到了字符串集合

但后来我将集合中的类型更改为名为observatestringext的类。该类有两个字段:StrItem,其中包含我希望在列表框中显示的字符串;以及IsSelected,一个支持字段。然后我创建了一个值转换器来提取StrItem字段并返回它

但是,当我查看传递给值转换器的Convert()方法的targetType时,我看到一种类型为IEnumerable。假设该参数中的Count属性与预期的列表项数匹配,则Convert()方法似乎是接收对整个集合的引用,而不是observateStringext,集合中每个项的类型。这当然是个问题。这是什么原因造成的?我在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代码。注意命令\u frequencyUsed是在主视图模型中找到的类型为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}}" />

以下是包含列表框绑定到的集合的类和集合包含的类的代码:

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
公共类ObservableStringExt
{
公共字符串StrItem{get;set;}
公共布尔值被选为{get;set;}
}
公共类ObservableCollectionWithFile:BaseNotifyPropertyChanged
{
public const string CollectionPropertyName=“Collection”;
私有ObservableCollection_ObservableCollection=新ObservableCollection();
公开收集
{
获取{return\u observateCollection;}
私有集{SetField(ref _observetecollection,value);}
}
}//公共类ObservableCollectionWithFile

我也有同样的问题。不确定它应该如何正常工作,但更改转换器以同时转换项目列表会有所帮助(我发现这比为列表创建单独的转换器更容易)

公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性) { 变量列表=作为IEnumerable的值; 如果(列表!=null) { 返回列表。选择(x=>Convert(x,typeof(string),null,culture)); } 如果(值为ObservableStringExt) 返回(值为ObservableStringExt).StrItem; }
我也有同样的问题。不确定它应该如何正常工作,但更改转换器以同时转换项目列表会有所帮助(我发现这比为列表创建单独的转换器更容易)

公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性) { 变量列表=作为IEnumerable的值; 如果(列表!=null) { 返回列表。选择(x=>Convert(x,typeof(string),null,culture)); } 如果(值为ObservableStringExt) 返回(值为ObservableStringExt).StrItem; }
值的实际类型如何,您检查过了吗?您的代码不正确。是,ObservableCollectionWithFile中的集合是ObservableCollection,好的。。。。但是Commands\u FrequentlyUserd.Collection的返回值可能不同。将代码放入测试项目中,而不使用Commands\u FrequentlyUserd部分。我可以将转换器中的值作为ObservableCollection获取,它看起来非常好。@csmh99它应该是ObservableStringText类型,集合中的单个项,而不是整个集合。你是说
命令\u频繁使用。集合
只是单个项吗?这显然是一个项目的集合。这就是将在转换中传递的内容(作为原始绑定值)。关于
值的实际类型如何,您检查过了吗?您的代码不正确。是,ObservableCollectionWithFile中的集合是ObservableCollection,好的。。。。但是Commands\u FrequentlyUserd.Collection的返回值可能不同。将代码放入测试项目中,而不使用Commands\u FrequentlyUserd部分。我可以将转换器中的值作为ObservableCollection获取,它看起来非常好。@csmh99它应该是ObservableStringText类型,集合中的单个项,而不是整个集合。你是说
命令\u频繁使用。集合
只是单个项吗?这显然是一个项目的集合。这就是将在转换中传递的内容(作为原始绑定值)。
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;
}