更改树视图中选择项目
问题描述:
的财产我有一个树视图模板这样的:更改树视图中选择项目
<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
(我将添加到链表的这一次)是相同的,它会更改previous
和itemToAdd
的属性ProductValue
,此时t他的代码执行:
itemToAdd.ProductValue = previous.ProductValue + 1;
那么我应该如何解决这个问题?提前致谢!
答
该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
)。
LinkedList包含*引用*到产品对象。因此,如果两个引用引用同一个对象,则可以使用这些引用中的任何一个来更改此对象。 – mm8
@ mm8感谢您的回复。我相信是这样。我也试过'Array',它有同样的问题。那么,如果我想实现这个目标,我该怎么办? – user8595258
我不明白你的代码应该做什么以及你试图完成什么。而使用数组而不是LinkedList完全没有区别。你仍然存储引用。 – mm8