ObservableCollection和Binding问题

时间:2014-08-14 15:32:28

标签: c# wpf binding observablecollection

好的我将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?

1 个答案:

答案 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}"/>

不再需要转换器了。