Доброго времени суток.
Я делаю сложный грид, в котором количество столбцов зависит от количество дней в месяце.
В связи с этим создаю столбцы и назначаю им биндинг программно примерно так:
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, а он не знает, что это за столбец)
Кто-нибудь с таким сталкивался? Как обойти это ограничение?
Спасибо.
Здравствуйте, 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>Спасибо.
Здравствуйте, Gremlin2, Вы писали:
G>Здравствуйте, MAMOHT, Вы писали:
MAM>>Кто-нибудь с таким сталкивался? Как обойти это ограничение?
G>Сталкивались. Если у вас есть необходимость программно устанавливать байндинг в шаблоне, то и сам шаблон создавайте из кода при помощи FrameworkElementFactory:
ООО. Стыдно-то как. Не догадался.
Спасибо, завтра буду пробовать.