как создать привязку в коде, когда шаблон данных объявлен в xaml - PullRequest
1 голос
/ 07 сентября 2011

У меня есть табличка с данными, объявленная в xaml.
например,

    <DataTemplate x:Key="TestTemplate">
        <StackPanel>
            <TextBox Name="txtBox"  Visibility="Visible"></TextBox>                
        </StackPanel>             
    </DataTemplate>

Я хочу установить привязку для txtBox в коде до генерации элемента, потому что у меня разные пути привязки для разных генерируемых элементов

Я могу получить шаблон в коде как:

DataTemplate tmplt = FindResource("TestTemplate") as DataTemplate;

, но я не уверен, что делать дальше.Как получить ссылку txtBox для установки привязки.

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Мы должны помнить одну вещь: шаблоны не являются экземплярами пользовательского интерфейса. Они являются потоковыми объектами в XAML и используются совместно элементами UI. Поэтому, если вы отредактируете шаблон данных и измените его структуру (добавив, отредактировав, удалив элемент под шаблоном), он изменит один шаблон данных, который является общим для элементов управления. Таким образом, другие элементы, использующие этот шаблон, также будут затронуты изменением.

Теперь давайте рассмотрим вашу проблему добавления динамического связывания в текстовое поле. Вы говорите, что каждое сгенерированное текстовое поле будет иметь разные пути привязки. Так что это определенно НЕ требует изменения самого шаблона данных!

Вам нужно будет получить доступ к текстовому полю и добавить к нему динамические привязки ПОСЛЕ создания текстового поля.

Я вижу, что ваша привязка отличается в зависимости от вашей "ситуации", так почему вы не можете использовать TemplateSelector? Селектор шаблона будет определять, какой шаблон данных (с одной конкретной привязкой, примененной к TetxBox) во время выполнения.

1 голос
/ 07 сентября 2011

Первая часть ответа - это FindName () метод.

пример:

DataTemplate tmplt = FindResource("TestTemplate") as DataTemplate;
TextBox my = (TextBox)tmplt.FindName("txtBox");

попробуйте это, это должно помочь получить доступ к TextBox элементу управления.Я думаю, что вы знаете, как связать с.Если вы хотите, чтобы привязка данных велась иначе, используйте MultiBinding и Converter.

РЕДАКТИРОВАТЬ

public class GeneralObject
{
    private object someObject;
    public GeneralObject(object initObject)
    {
        this.someObject = initObject;
    }

    //If you want to bind to some text, for example
    public string Text
    {
        get
        {
            //I think you know which objects are coming as input
            if (this.someObject is SpecialClass1)
                return ((SpecialClass1)this.someObject).SpecialClass1TextProperty;
            if (this.someObject is SpecialClass2)
                return ((SpecialClass2)this.someObject).SpecialClass2TextProperty;
            //and so on.
        }
    }

}

РЕДАКТИРОВАТЬ 2 Еще одинВозможный путь

Так что я помню, что у WPF есть ContentControl!

<ContentControl Content="{Binding Path=CurrentObject}"/>

Но в этом случае вам нужно создать число DataTemplate, каждый Template для одного класса.

<DataTemplate DataType="{x:Type local:SpecialClass1}">
    ...
</DataTemplate>
<DataTemplate DataType="{x:Type local:SpecialClass2}">
    ...
</DataTemplate>
<!--and so on-->

Разрешение WPF DataTypes из ContentControl.Content собственности, и положить на ContentControl право DataTemplate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...