好的我将Class Mod定义为
public class Mod
{
public Mod()
{
Data = new ObservableCollection<object>();
}
public Mod(Mod other)
{
Data = new ObservableCollection<object>(other.Data);
}
public ObservableCollection<object> Data { get; private set; }
}
和控件
<TreeView x:Name="ItemList" DockPanel.Dock="Left" DataContext="{Binding Mod, Source={StaticResource Core}}" >
<TreeView.Resources>
<DataTemplate x:Key="TVTemplate" >
<TreeViewItem Header="{Binding Name}" Tag="{Binding }" ToolTip="{Binding Desc}" />
</DataTemplate>
</TreeView.Resources>
<TreeViewItem Header="Item1" ItemsSource="{Binding Data, ConverterParameter={x:Type local:Item1Type}, Converter={StaticResource OMTypeConverter}}" ItemTemplate="{DynamicResource TVTemplate}"/>
<TreeViewItem Header="Item2" ItemsSource="{Binding Data, ConverterParameter={x:Type local:Item2Type}, Converter={StaticResource OMTypeConverter}}" ItemTemplate="{DynamicResource TVTemplate}"/>
类型转换器定义为
public class OMTypeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
List<object> rtn = new List<object>();
ObservableCollection<object> data= value as ObservableCollection<object>;
if (data!= null)
{
Type type = parameter as Type;
if (type != null)
{
var tmp = data.Where(o => type.IsInstanceOfType(o));
rtn.AddRange(tmp);
}
}
return rtn;
}
}
加载窗口时,它完美地工作,类型转换器显示的值是一个空的Observable对象集合,但是当我向OC添加项目时没有发生任何事情,转换器未被调用且项目列表在屏
我已从后面的代码中确认该值已添加到数据集
那么为什么没有触发绑定来更新treeveiwitem?
答案 0 :(得分:1)
在您的转换器中,您将断开与原始集合的链接。
我可以想到一些解决方法,但有一个干净的解决方案。
您应该在数据上使用两个集合视图。
在你的代码中声明它们:
public ICollectionView Item1TypeView { get; set; }
public ICollectionView Item2TypeView { get; set; }
并在视图的构造函数中初始化它们:
Item1TypeView = new CollectionViewSource { Source = Data }.View;
Item1TypeView.Filter = e => e is Item1Type;
Item2TypeView = new CollectionViewSource { Source = Data }.View;
Item2TypeView.Filter = e => e is Item2Type;
然后将每个TreeView
绑定到其中一个:
<TreeViewItem Header="Item1" ItemsSource="{Binding Item1TypeView}" ItemTemplate="{DynamicResource TVTemplate}"/>
<TreeViewItem Header="Item2" ItemsSource="{Binding Item2TypeView}" ItemTemplate="{DynamicResource TVTemplate}"/>
不再需要转换器了。