2012-08-25 283 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")