从数据对象获取UI对象

时间:2010-02-01 16:47:03

标签: c# wpf data-binding datatemplate

我有一个类(MockWI)我在app.xml中定义了以下DataTemplate

<DataTemplate DataType="{x:Type local:MockWI}">
    <Button Content="{Binding Name}"/>
</DataTemplate>

在我的代码中,我需要找到MockWI实例的UI对象。

现在我这样做:

Button elt = new Button { Content = myMockWI};

但是这给了我一个按钮按钮。

我想获得名为myMockWI的MockWI按钮。像这样:

Button elt = GetUIControlFromVar(myMockWI);

有办法做到这一点吗?


添加更多代码以显示上下文:

    public UIElement GetVisualFeedback(IDataObject obj)
    {
        MockWI test = ExtractElement(obj);

        // Since Content is set to a MockWI I get a button in a button.
        Button elt = new Button{ Content = test, Opacity = 0.5, IsHitTestVisible = false };

        DoubleAnimation anim = new DoubleAnimation(0.75, new Duration(TimeSpan.FromMilliseconds(500)))
                                   {
                                       From = 0.25,
                                       AutoReverse = true,
                                       RepeatBehavior = RepeatBehavior.Forever
                                   };
        elt.BeginAnimation(UIElement.OpacityProperty, anim);

        return elt;
    }

2 个答案:

答案 0 :(得分:2)

没有这样的方法,只是因为数据对象和UI对象之间没有一对一的关系,即可能有几个UI对象的数据上下文指向同一个数据对象。

如果您的数据对象属于某种项控件(ItemsControlListBoxListViewDataGrid等),则可以获取相关的项容器使用ItemsControl.ItemContainerGenerator.GetContainerFromItem方法。

答案 1 :(得分:1)

好吧,你不应该做那样的事情(在建筑上肯定有更正确的方法)。

如果您需要对DataTemplate内的某些内容进行动画处理,为什么不使用EventTrigger - 或简单触发器EnterActions / ExitActions指定要运行的动画。

动画(Storyboard)可以用XAML编写和/或使用工具设计(例如Blend)。