更改treeview所选项目的属性

时间:2017-09-15 02:10:18

标签: c# wpf data-binding treeview

我有一个这样的树视图模板:

<HierarchicalDataTemplate DataType="{x:Type data:Category}" ItemsSource="{Binding Path=Products}">
    <TextBlock Text="{Binding Path=CategoryName}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type data:Product}">
    <StackPanel>
        <StackPanel.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Add To Project" Click="MenuItem_OnClick"/>
            </ContextMenu>
        </StackPanel.ContextMenu>
        <TextBlock Text="{Binding Path=ModelName}" />
    </StackPanel>
</HierarchicalDataTemplate>

我正在尝试将treeview项添加到链表:

LinkedList<Product> dll = new LinkedList<Product>();
private void MenuItem_OnClick(object sender, RoutedEventArgs e)
{
     var itemToAdd = this.tv_Project.SelectedItem as Product;
     Product previous = dll.ElementAt(dll.Count - 1);

     if(itemToAdd.CategoryID == 1)
     {
          dll.AddLast(ItemToAdd);
     }
     else if(itemToAdd.CategoryID == 2)
     {
          itemToAdd.ProductValue = previous.ProductValue + 1;
     }
     ...
}

现在当我运行上面的代码时,我发现如果previous(我上次添加到链接列表中)和itemToAdd(我将添加到链接列表中)这次是相同的,它会在执行此代码时更改ProductValueprevious的属性itemToAdd

itemToAdd.ProductValue = previous.ProductValue + 1;

那我应该怎么解决这个问题呢?提前谢谢!

1 个答案:

答案 0 :(得分:0)

LinkedList<T>包含引用Product个对象。因此,如果两个引用引用同一个对象,则可以使用任何这些引用更改此对象。

您可能想尝试将副本的产品添加到LinkedList<T>

/* create a new Product object here and set all of its properties: */
ddl.AddLast(new Product() { Name = ItemsToAdd.Name });

您可能还想了解引用类型在.NET中的工作方式。

关于参考和价值类型之间的差异:

What is the difference between a reference type and value type in c#?

根据您的要求,您可能希望将Product定义为值类型(struct)。