2

我有一个方法,它根据在 TreeView 中单击的项目接收事件。

我可以以完全相同的方式将项目添加到 TreeView 和 TreeViewItem,因此尝试item根据类型分配为 TreeView 或 TreeViewItem state.sender。但是,目前我可以使它工作的唯一方法是首先将项目分配为对象。

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

3 回答 3

5

TreeView并且TreeViewItem都派生自ItemsControl,并且添加项目是使用已经可用的方法完成的,因此您应该能够简单地使用

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

    // add to item
}
于 2012-08-25T17:35:16.023 回答
4

根据您的 C# 版本,您可以使用新的动态类型:http:
//msdn.microsoft.com/en-us/library/dd264736.aspx

于 2012-08-25T17:22:53.610 回答
3

我同意其他评论者的观点,即您的问题描述不充分,但如果您想做的是多态处理 TreeView/TreeViewItem,您可以简单地使用 ItemsControl 类型的变量。

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

else
    throw InvalidArgumentException("state.sender")
于 2012-08-25T17:36:52.500 回答