WPF. Программный Binding и CellTemplateSelector
От: MAMOHT  
Дата: 23.02.13 17:19
Оценка:
Доброго времени суток.

Я делаю сложный грид, в котором количество столбцов зависит от количество дней в месяце.

В связи с этим создаю столбцы и назначаю им биндинг программно примерно так:

for(int i=1; i<days; i++)
{
   Binding b = "DetailedPlan[" + i.ToString() + "].Volume"
бла-бла-бла
}



Мне понадобилось чтобы для некоторых строк, ячейки состояли из двух половинок, т.е. надо прикручивать CellTemplateSelector. Сделал.
Вот один из шаблонов.

<DataTemplate x:Key="MsgCellFirst">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Border BorderThickness="0, 0, 0, 1" Margin="-3" BorderBrush="{Binding MSGColor}">
        <TextBlock Text="{DetailedPlan[  ___???___look_at_me   ].Volume}" Grid.Row="0" TextAlignment="Center" Margin="0, 3, 0, 0"/>
    </Border>
    <TextBlock Text="факт" Grid.Row="1" TextAlignment="Center" Margin="0, 3, 0, 0"/>
</Grid>
</DataTemplate>


Но проблема в том, что я не могу залезть в этот шаблон и программно указать свой биндинг (посколько, шаблон выдает TemplateSelector, а он не знает, что это за столбец)

Кто-нибудь с таким сталкивался? Как обойти это ограничение?

Спасибо.
Re: WPF. Программный Binding и CellTemplateSelector
От: Gremlin2 http://www.fb2library.net/
Дата: 24.02.13 08:17
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Доброго времени суток.


MAM>Я делаю сложный грид, в котором количество столбцов зависит от количество дней в месяце.


MAM>В связи с этим создаю столбцы и назначаю им биндинг программно примерно так:


MAM>Но проблема в том, что я не могу залезть в этот шаблон и программно указать свой биндинг (посколько, шаблон выдает TemplateSelector, а он не знает, что это за столбец)


MAM>Кто-нибудь с таким сталкивался? Как обойти это ограничение?


Сталкивались. Если у вас есть необходимость программно устанавливать байндинг в шаблоне, то и сам шаблон создавайте из кода при помощи FrameworkElementFactory:

        private class DynamicPathTemplateSelector : DataTemplateSelector
        {
            private readonly string displayPath;
            private readonly string valuePath;
            private readonly RadioGroup parent;

            private DataTemplate controlTemplate;

            public DynamicPathTemplateSelector(RadioGroup parent, string displayPath, string valuePath)
            {
                this.parent = parent;
                this.displayPath = displayPath;
                this.valuePath = valuePath;
            }

            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                if (controlTemplate == null)
                {
                    controlTemplate = new DataTemplate();

                    FrameworkElementFactory radioButtonFactory = new FrameworkElementFactory(typeof(RadioGroupButton));
                    FrameworkElementFactory textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));

                    textBlockFactory.SetBinding(TextBlock.TextProperty, new Binding(displayPath));

                    radioButtonFactory.AppendChild(textBlockFactory);

                    Binding valueBinding = new Binding("Value");
                    valueBinding.Source = parent;
                    valueBinding.Mode = BindingMode.TwoWay;
                    radioButtonFactory.SetBinding(RadioGroupButton.ValueProperty, valueBinding);

                    Binding checkedValueBinding = new Binding(valuePath);
                    radioButtonFactory.SetBinding(RadioGroupButton.CheckedValueProperty, checkedValueBinding);
                    radioButtonFactory.SetValue(RadioButton.GroupNameProperty, RuntimeHelpers.GetHashCode(parent).ToString());

                    controlTemplate.VisualTree = radioButtonFactory;
                    controlTemplate.Seal();
                }

                return controlTemplate;
            }
        }


MAM>Спасибо.
Re[2]: WPF. Программный Binding и CellTemplateSelector
От: MAMOHT  
Дата: 24.02.13 17:16
Оценка:
Здравствуйте, Gremlin2, Вы писали:

G>Здравствуйте, MAMOHT, Вы писали:


MAM>>Кто-нибудь с таким сталкивался? Как обойти это ограничение?


G>Сталкивались. Если у вас есть необходимость программно устанавливать байндинг в шаблоне, то и сам шаблон создавайте из кода при помощи FrameworkElementFactory:


ООО. Стыдно-то как. Не догадался.

Спасибо, завтра буду пробовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.