Wpf 是否有任何方法可以转换用作ItemsSource的集合的成员?
在WPF中,您可以使用IValueConverter或IMultiValueConverter将数据绑定值从Wpf 是否有任何方法可以转换用作ItemsSource的集合的成员?,wpf,Wpf,在WPF中,您可以使用IValueConverter或IMultiValueConverter将数据绑定值从int转换为颜色。 我有一个模型对象集合,我想将其转换为ViewModel表示,但在本场景中 <ListBox ItemsSource="{Binding ModelItems, Converter={StaticResource ModelToViewModelConverter}" /> 将编写转换器以一次性转换整个集合modeleItems 我想单独转换
int
转换为颜色。
我有一个模型对象集合,我想将其转换为ViewModel表示,但在本场景中
<ListBox ItemsSource="{Binding ModelItems,
Converter={StaticResource ModelToViewModelConverter}" />
将编写转换器以一次性转换整个集合modeleItems
我想单独转换集合中的项目,有办法吗?我可能希望使用
CollectionViewSource
并具有一些过滤逻辑,这样我就不必在每次发生变化时都迭代整个集合。您不能在集合本身上设置转换器,因为它会将集合作为输入。你有两个选择:
<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并具有一些过滤逻辑,这样我就不想在每次发生变化时都重复整个集合,因此我的问题的最后一句话。对不起,我没有看到最后一句话。祝你好运