Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 是否有任何方法可以转换用作ItemsSource的集合的成员?_Wpf - Fatal编程技术网

Wpf 是否有任何方法可以转换用作ItemsSource的集合的成员?

Wpf 是否有任何方法可以转换用作ItemsSource的集合的成员?,wpf,Wpf,在WPF中,您可以使用IValueConverter或IMultiValueConverter将数据绑定值从int转换为颜色。 我有一个模型对象集合,我想将其转换为ViewModel表示,但在本场景中 <ListBox ItemsSource="{Binding ModelItems, Converter={StaticResource ModelToViewModelConverter}" /> 将编写转换器以一次性转换整个集合modeleItems 我想单独转换

在WPF中,您可以使用IValueConverter或IMultiValueConverter将数据绑定值从
int
转换为
颜色。

我有一个模型对象集合,我想将其转换为ViewModel表示,但在本场景中

<ListBox ItemsSource="{Binding ModelItems, 
     Converter={StaticResource ModelToViewModelConverter}" />

将编写转换器以一次性转换整个集合
modeleItems


我想单独转换集合中的项目,有办法吗?我可能希望使用
CollectionViewSource
并具有一些过滤逻辑,这样我就不必在每次发生变化时都迭代整个集合。

您不能在集合本身上设置转换器,因为它会将集合作为输入。你有两个选择:

  • 确保转换器也可以处理集合(IEnumerable)
  • 在项目模板中使用转换器
  • 如果要使用第二种方法,请使用以下方法:

    <ListBox ItemsSource="{Binding ModelItems}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <ContentPresenter Content="{Binding Converter={StaticResource ModelToViewModelConverter}}" 
                            ContentTemplate="{StaticResource MyOptionalDataTemplate}"/>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    
    ModelItems = new ObservableCollection<string>();
            ModelItems.Add("third");
            ModelItems.Add("first");
            ModelItems.Add("second");
    
    
    

    如果不需要自定义数据模板,则可以跳过ContentTemplate属性。

    可以。其作用与IValueConverter相同。您只需将Convert方法的value参数视为一个集合

    以下是集合的转换器示例:

    public class DataConvert : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            ObservableCollection<int> convertible = null;
            var result = value as ObservableCollection<string>;
    
            if (result != null)
            {
                convertible = new ObservableCollection<int>();
                foreach (var item in result)
                {
                    if (item == "first")
                    {
                        convertible.Add(1);
                    }
                    else if (item == "second")
                    {
                        convertible.Add(2);
                    }
                    else if (item == "third")
                    {
                        convertible.Add(3);
                    }
                }
            }
    
            return convertible;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    
    公共类数据转换:IValueConverter
    {
    公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
    {
    ObservableCollection=null;
    var结果=作为可观察集合的值;
    如果(结果!=null)
    {
    可转换=新的可观察集合();
    foreach(结果中的var项目)
    {
    如果(项目==“第一个”)
    {
    增加第(1)款;
    }
    否则如果(项目==“秒”)
    {
    增加(2);
    }
    否则如果(项目==“第三个”)
    {
    增加(3);
    }
    }
    }
    可转换收益;
    }
    公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
    {
    抛出新的NotImplementedException();
    }
    }
    
    在这个例子中,这只是一个概念的证明,但我认为它应该很好地展示这个想法。 转换器从以下字符串的简单集合进行转换:

    <ListBox ItemsSource="{Binding ModelItems}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <ContentPresenter Content="{Binding Converter={StaticResource ModelToViewModelConverter}}" 
                            ContentTemplate="{StaticResource MyOptionalDataTemplate}"/>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    
    ModelItems = new ObservableCollection<string>();
            ModelItems.Add("third");
            ModelItems.Add("first");
            ModelItems.Add("second");
    
    modeleItems=新的ObservableCollection();
    模型项。添加(“第三”);
    模型项。添加(“第一”);
    模型项。添加(“第二”);
    
    转换为与字符串含义对应的整数集合

    这里是相应的XAML(loc是当前组件的参考,其中是转换器):

    
    

    如果要进行双向绑定,还必须实现转换回。根据使用MVVM的经验,我建议使用类似于Factory模式的东西来从ViewModel中的模型向后转换

    这里是另一个例子。我使用的是MVVM Caliburn Micro。在我的例子中,MyObjects是一个枚举列表

    <ListBox x:Name="MyObjects">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding ., Converter={StaticResource MyConverter}}"/>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    
    
    
    谢谢louie,但这并不是我真正想要的,我可能想使用CollectionViewSource并具有一些过滤逻辑,这样我就不想在每次发生变化时都重复整个集合,因此我的问题的最后一句话。对不起,我没有看到最后一句话。祝你好运