2017-09-15 130 views
0

的财产我有一个树视图模板这样的:更改树视图中选择项目

<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(我将添加到链表的这一次)是相同的,它会更改previousitemToAdd的属性ProductValue,此时t他的代码执行:

itemToAdd.ProductValue = previous.ProductValue + 1; 

那么我应该如何解决这个问题?提前致谢!

+0

LinkedList包含*引用*到产品对象。因此,如果两个引用引用同一个对象,则可以使用这些引用中的任何一个来更改此对象。 – mm8

+0

@ mm8感谢您的回复。我相信是这样。我也试过'Array',它有同样的问题。那么,如果我想实现这个目标,我该怎么办? – user8595258

+0

我不明白你的代码应该做什么以及你试图完成什么。而使用数组而不是LinkedList完全没有区别。你仍然存储引用。 – mm8

回答

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)。

相关问题