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>Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.