如何在TreeView wpf中删除NewItemPlaceholder

时间:2013-12-11 13:58:09

标签: .net wpf binding treeview

我将ObservableCollection绑定到ListView,最后得到{NewItemPlaceholder}行。如何隐藏或删除该行?

enter image description here

<TreeView ItemsSource="{Binding MyDataToDisplay}">

集合看起来像:

ObservableCollection<MyElement> MyDataToDisplay

4 个答案:

答案 0 :(得分:2)

旧问题,但刚刚遇到这个问题。我有一个树视图&amp; datagrid绑定到同一数据源;然而,使数据网格IsReadOnly = true不是一个选项,因为我需要能够编辑数据网格。我发现设置CanUserAddRows = false修复了问题,仍允许我编辑Datagrid。

答案 1 :(得分:1)

只需在ListView的XAML中设置一个ItemTemplate(在我的例子中是TreeView,发生相同的故障),并将其绑定到过滤器转换器。这看起来像这样:

<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
        <ContentControl Content="{Binding Converter={StaticResource IgnoreNewItemPlaceholderConverter}}"/>                  
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>

现在你必须像这样添加一个Filter-Converter-Class:

class IgnoreNewItemPlaceholderConverter : IValueConverter {
    public static readonly IgnoreNewItemPlaceholderConverter Instance = new IgnoreNewItemPlaceholderConverter();

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        if (value != null && value.ToString() == "{NewItemPlaceholder}")
            return DependencyProperty.UnsetValue;
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        throw new NotImplementedException();
    }
}

并且不要忘记将此Filterclass映射到XAML中的静态资源,如下所示:

<converter:IgnoreNewItemPlaceholderConverter x:Key="IgnoreNewItemPlaceholderConverter"/>

这是由绑定到同一数据源的DataGrid绑定引起的,不是“IsReadOnly = True”(可写)。如果这仍然符合您的要求,您还可以尝试使DataGrid只读或绑定到不同的数据源。

答案 2 :(得分:1)

和很多人一样,我遇到了同样的问题,但经过一番思考后,我发现我可以在ViewModel中创建一个bool属性并将其绑定到DataGrid CanUserAddRows属性,如下所示。然后我可以根据需要使属性成为真或假:

private bool _canUserAddRows;
    public bool CanUserAddRows
    {
        get { return _canUserAddRows; }
        set
        {
            _canUserAddRows = value;

            NotifyPropertyChanged("CanUserAddRows");
        }
    }

&#13;
&#13;
<--!--DataGrid property --!-->
CanUserAddRows="{Binding CanUserAddRows,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
&#13;
&#13;
&#13;

这更容易,效果也很好。希望它能帮到你。

答案 3 :(得分:0)

突然间我解决了我的问题。问题是在同一窗口上我有一个绑定到同一个集合的DataGrid。我认为我必须使DataGrid只读取消除TreeView中的那一行。但是,DataGrid仅用于测试目的,因此问题就消失了。