2012-08-25 76 views
2

我有接收基于点击一个TreeView内该项目事件的方法。声明变量的if else-if语句

我可以以完全相同的方式将项目添加到TreeView和TreeViewItem,因此试图将item分配为基于state.sender类型的TreeView或TreeViewItem。但是,目前我能做到的唯一方法就是先将项目指定为对象。

private void ProcessEvent(Events.GetEventsResp resp, CustomAsyncStateContainer state) 
{ 
    object item = new object(); //must be a better way than this? 
    if (state.sender is TreeViewItem) 
     item = (TreeViewItem)state.sender; 

    else if (state.sender is TreeView) 
     item = (TreeView)state.sender; 

    //other code 
} 

我假定这被称为拆箱?有没有更好的方法来做我正在尝试的?

编辑:下面是余下的代码。在提问时我还没有写完,现在已经意识到object item = new object();在这种情况下不起作用。

private void DisplayGetEvent(Events.GetEventsResp resp, CustomAsyncStateContainer state) 
{ 
    object node = new object(); 
    if (state.sender is TreeViewItem) 
     node = (TreeViewItem)state.sender; 

    else if (state.sender is TreeView) 
     node = (TreeView)state.sender; 

    if (resp.eventItems != null) 
    { 
     Events.UXEvent[] eventItems = resp.eventItems; 
     Array.Sort(eventItems, new UXWrapper.UXEventComparer()); 

     int itemCount = eventItems.Length; 
     TreeViewItem tvItem = new TreeViewItem; 
     for (int i = 0; i < itemCount; i++) 
     { 

      tvItem.Header = eventItems[i].name; 
      tvItem.Tag = eventItems[i]; 

      node.Items.Add(tvItem); 

     } 

    } 
} 
+4

你可以发布整个代码吗?我需要了解为什么你需要像你一样分配变量。 –

+2

您可以直接将'item'分配给'null'。无需创建新对象 – alf

+4

拆箱即将装箱值类型转换为拆箱值。由于'TreeView'和'TreeViewItem'是引用类型,所以不能拆箱。另外,由于item仍然被输入为“object”,因此您的演员和类型检查是多余的。没有看到代码的其余部分,不可能说出最好的方法。 – Lee

回答

5

TreeViewTreeViewItem无论从ItemsControl派生,并添加项目使用方法进行已经可用,所以你应该可以简单地使用

private void ProcessEvent(Events.GetEventsResp resp, CustomAsyncStateContainer state) 
{ 
    var item = (ItemsControl)state.sender; 

    // add to item 
} 
+0

击败了我:-) – staafl

3

我同意th e其他评论者认为你的问题描述不够,但如果你想要做的是多态地对待TreeView/TreeViewItem,你可以简单地使用ItemsControl类型的变量。

if (state.sender is ItemsControl) 
    item = (TreeViewItem)state.sender; 

else 
    throw InvalidArgumentException("state.sender")