2016-02-16 5 views
0

Я хотел бы иметь datagrid с столбцом флажка со следующим поведением: флажок расположен по центру, а фон ячейки - зеленый, когда флажок установлен.Re-Usable DataGridTemplateColumn Style

В настоящее время я достигаю этого со стилем для DataGridTemplateColumn (см. Ниже). Этот стиль отлично работает, однако свойство name, которому привязан флажок, ссылается дважды в стиле. Поэтому я не могу применить стиль к другому столбцу/сетке, привязанному к другому объекту/свойству.

Есть ли способ создать повторно используемое решение (с помощью DataGridCheckBoxColumn или иначе), в которое можно передать свойство bound?

Мой подарок XAML стиль:

<Style x:Key="IsClipToCalendarCheckBoxCellStyle" TargetType="DataGridCell"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <CheckBox IsChecked="{Binding IsClipToCalendar, UpdateSourceTrigger=PropertyChanged}" 
          VerticalAlignment="Center" 
          HorizontalAlignment="Center" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsClipToCalendar}" Value="True"> 
      <Setter Property="Background" Value="DeepSkyBlue" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

ответ

0

Вы можете создать DataTemplates динамически в коде-позади вашего Window:

private string StringTemplate = 
    @"<DataTemplate> 
     <StackPanel> 
      <Label Content=""fooTemplate"" /> 
      <TextBox Text=""{Binding Path=fooColumn}""/> 
     </StackPanel> 
    </DataTemplate>"; 

и AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" вы можете использовать DataTemplate:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    DataTemplate dt = null; 
    string dtString = StringTemplate.Replace("fooColumn", e.PropertyName); 
    dt = GetDataTemplateForDataGrid(dtString); 
    DataGridTemplateColumn c = new DataGridTemplateColumn() 
    { 
     CellTemplate = dt, 
     Header = e.Column.Header, 
     HeaderTemplate = e.Column.HeaderTemplate, 
     HeaderStringFormat = e.Column.HeaderStringFormat, 
     SortMemberPath = e.PropertyName 
    }; 
    e.Column = c; 
}  

и метод ge т DateTemplates:

private DataTemplate GetDataTemplateForDataGrid(string templateString) 
    { 
     ParserContext context = new ParserContext(); 
     context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); 
     context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml"); 
     return (DataTemplate)Parse(templateString, context); 
    } 

и метод для разбора не английские букв, если вы используете связывание с не английскими буквами:

public static object Parse(string xamlText, ParserContext parserContext) 
    { 
     return System.Windows.Markup.XamlReader.Load((Stream)new MemoryStream(Encoding.UTF8.GetBytes(xamlText)), parserContext); 
    } 
+0

@JoeKopp не стесняйтесь задавать любые вопросы. Если мой ответ поможет решить вашу проблему, вы можете отметить это как ответ, чтобы упростить будущий поиск других людей. Прочтите этот meta.stackexchange.com/questions/5234/... - StepUp 9 часов назад – StepUp

0

Вы можете попробовать сделать изменения в зарегистрированном Визуальном состоянии флажка вместо наличия триггера. Я ответил на это для телефона с телефоном 8.1 here. Адаптируйте его для wpf соответственно.

Надеюсь, это поможет! :)