[Wpf] создать триггер в runtime в DataTemplate
От: Аноним  
Дата: 31.01.11 18:50
Оценка:
<ListBox ItemsSource="..">
    <ListBox.DataTemplate>
          <TextBox></TextBox>
    </ListBox.DataTemplate>
</ListBox>


Допустим ItemsSource содержит 5 элементов — соотвественно выведется 5 текстбоксов.

Теперь нужно на один TextBox повесить триггер, чтобы при присвоении ему некоторого значения — другой TextBox становился допустим Disable.

Имена присваивать ( Name ) TextBoxам допустим я динамически могу ( через cпециальное Attach Property ).

Как создать триггер в runtime ?

пробовал так
 var t = new MultiDataTrigger();
 t.Conditions.Add( new Condition(){ ElementName="t1", Property="Text", Value="1"});
 t.Setters.Add( new Setter(){ TargetName="t2", Property="IsEnabled", Value="false"});
 listbox.Triggers.Add(t);

не работает
Re: [Wpf] создать триггер в runtime в DataTemplate
От: Аноним  
Дата: 01.02.11 04:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А><ListBox ItemsSource="..">
А>    <ListBox.DataTemplate>
А>          <TextBox></TextBox>
А>    </ListBox.DataTemplate>
А></ListBox>
А>


А>Допустим ItemsSource содержит 5 элементов — соотвественно выведется 5 текстбоксов.


А>Теперь нужно на один TextBox повесить триггер, чтобы при присвоении ему некоторого значения — другой TextBox становился допустим Disable.


А>Имена присваивать ( Name ) TextBoxам допустим я динамически могу ( через cпециальное Attach Property ).


А>Как создать триггер в runtime ?


Правильно ли я понимаю что тут будет работать только EventTrigger, т.к. Trigger, Multitrigger, DataTrigger, MultiDatatrigger — могут использоваться только в определении Style, DataTemplate и Control.Template — и срабатывают только на момент инициализации ?
Т.е. последние 4 триггера — по сути if( )... для инициализации начальных свойств для отображения ?
Re[2]: [Wpf] создать триггер в runtime в DataTemplate
От: MxMsk Португалия  
Дата: 01.02.11 06:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Правильно ли я понимаю что тут будет работать только EventTrigger, т.к. Trigger, Multitrigger, DataTrigger, MultiDatatrigger — могут использоваться только в определении Style, DataTemplate и Control.Template — и срабатывают только на момент инициализации ?

А>Т.е. последние 4 триггера — по сути if( )... для инициализации начальных свойств для отображения?
Я не интересовался почему так, но да — свойство Triggers у контролов поддерживает только EventTrigger.
Re: [Wpf] создать триггер в runtime в DataTemplate
От: Visor2004  
Дата: 01.02.11 08:39
Оценка:
Здравствуйте, Аноним, Вы писали:

В App.xaml:

<DataTemplate x:Key="template">
    <TextBox></TextBox>
</DataTemplate>



var template = Application.Current.FindResource("template") as DataTemplate;

var t = new MultiDataTrigger();
t.Conditions.Add( new Condition(){ ElementName="t1", Property="Text", Value="1"});
t.Setters.Add( new Setter(){ TargetName="t2", Property="IsEnabled", Value="false"});

template.Triggers.Add(t);
.....

itemsControl.ItemTemplate = template;


Единственное я не помню, запечатывается ли DataTemplate, если его объявить в разметке или нет, но это уже сами проверите. Разве для MultiDataTrigger надо заполнять коллекцию Conditions, не Bindings?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: [Wpf] создать триггер в runtime в DataTemplate
От: Codechanger Россия  
Дата: 01.02.11 09:16
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>
А><ListBox ItemsSource="..">
А>    <ListBox.DataTemplate>
А>          <TextBox></TextBox>
А>    </ListBox.DataTemplate>
А></ListBox>
А>


А>Допустим ItemsSource содержит 5 элементов — соотвественно выведется 5 текстбоксов.


А>Теперь нужно на один TextBox повесить триггер, чтобы при присвоении ему некоторого значения — другой TextBox становился допустим Disable.


А>Имена присваивать ( Name ) TextBoxам допустим я динамически могу ( через cпециальное Attach Property ).


А>Как создать триггер в runtime ?


А>пробовал так

А>
А> var t = new MultiDataTrigger();
А> t.Conditions.Add( new Condition(){ ElementName="t1", Property="Text", Value="1"});
А> t.Setters.Add( new Setter(){ TargetName="t2", Property="IsEnabled", Value="false"});
А> listbox.Triggers.Add(t);
А>

А>не работает

Я бы на вашем месте подобную сложную логику(по выставлению различных свойств) делал в коде. Т.е. у вас есть набор неких объектов, у которых есть свойство Text и свойство Enabled(допустим).
Объекты лежат в коллекции, которую вы биндите на ListBox.Шаблон для айтема будет очень простой и единый для всех. А уже в коде делайте со своими объектами что хотите. Не стоит навешивать на XAML
несвойственные ему функции.
Re[2]: [Wpf] создать триггер в runtime в DataTemplate
От: Аноним  
Дата: 02.02.11 04:45
Оценка:
А>>
А>> var t = new MultiDataTrigger();
А>> t.Conditions.Add( new Condition(){ ElementName="t1", Property="Text", Value="1"});
А>> t.Setters.Add( new Setter(){ TargetName="t2", Property="IsEnabled", Value="false"});
А>> listbox.Triggers.Add(t);
А>>

А>>не работает

C>Я бы на вашем месте подобную сложную логику(по выставлению различных свойств) делал в коде. Т.е. у вас есть набор неких объектов, у которых есть свойство Text и свойство Enabled(допустим).


Так я в коде и делаю Приведенный выше фрагмент это разве не код ?

C>Объекты лежат в коллекции, которую вы биндите на ListBox.Шаблон для айтема будет очень простой и единый для всех. А уже в коде делайте со своими объектами что хотите. Не стоит навешивать на XAML

C>несвойственные ему функции.

XAML я тут как раз и не использую , см код — это обычный C#.

Возможно имелось ввиду что не использовать триггеры ? Но ситуация такая у меня в базе предполагается структура похожая на описание триггера,
т.е. 6 колонок — sourcename, sourceproperty, sourcevalue, targetname, targetsource, targetvalue.
Собственно можно конечно написать свои триггеры на propertychanged, но я пока хочу попробовать использовать существующие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.