Получить объект пользовательского интерфейса из объекта данных - PullRequest
1 голос
/ 01 февраля 2010

У меня есть класс (MockWI), в котором я определил следующий DataTemplate в app.xml

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

В моем коде мне нужно найти объект пользовательского интерфейса, который есть у экземпляра MockWI.

Прямо сейчас я делаю это:

Button elt = new Button { Content = myMockWI};

Но это дает мне кнопку в кнопке.

Я хочу просто получить кнопку, которая называется MockWI и называется myMockWI. Примерно так:

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 ]

2 голосов
/ 01 февраля 2010

Нет такого метода, хотя бы по той причине, что между объектами данных и объектами пользовательского интерфейса нет взаимно-однозначного отношения, то есть может быть несколько объектов пользовательского интерфейса с контекстами данных, указывающими на один и тот же объект данных.

Если ваш объект данных является частью какого-либо элемента управления элементами (ItemsControl, ListBox, ListView, DataGrid и т. Д.), Вы можете получить соответствующий контейнер элементов с помощью метода ItemsControl.ItemContainerGenerator.GetContainerFromItem.

1 голос
/ 01 февраля 2010

Ну, вы не должны делать ничего подобного (наверняка есть более правильный путь архитектурно).

Если вам нужно сделать анимацию для чего-то внутри DataTemplate, почему бы вам не использовать EventTrigger -s или простые триггеры с EnterActions / ExitActions, где вы можете указать, какую анимацию запускать. *

Анимация (Storyboard) может быть написана на XAML и / или разработана с использованием инструмента (например, Blend).

...