2015-06-15 6 views
1

Я создаю пользовательский элемент управления DataGrid, который имеет свойство ShowCloneColumn. Если вы установите для этого свойства значение true, DataGrid должен добавить еще один столбец с кнопкой.Пользовательский WPF DataGrid с необязательным столбцом кнопки

Класс, который я создал, получен из DataGrid и реализовал свойство Dependency, ShowCloneColumn.

public static readonly DependencyProperty ShowCloneColumnProperty = 
      DependencyProperty.Register("ShowCloneColumn", 
      typeof(bool), 
      typeof(CloneRowDataGrid), 
      new FrameworkPropertyMetadata(false, 
       FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
       OnShowCloneColumnPropertyChanged)); 

    public bool ShowCloneColumn 
    { 
     get { return (bool) GetValue(ShowCloneColumnProperty); } 
     set { SetValue(ShowCloneColumnProperty, value); } 
    } 

В Generic.xaml У меня есть следующий стиль.

<!-- Somewhere in here a button column should be declared? --> 
<Style TargetType="{x:Type uiControls:CloneRowDataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type uiControls:CloneRowDataGrid}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="ShowCloneColumn" Value="True"> 
          <!-- Show clone column, a column with a button --> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Я не настолько силен, но с шаблонами и пользовательское управления, так что я не уверен, куда добавить столбец кнопки, так что он будет виден, когда кто-то использует CloneRowDataGrid и устанавливает свойство зависимостей ShowCloneColumn в правда.

ответ

0

Мне пришлось удалить раздел из стиля Generic.xaml для DataGrid для правильной компоновки и создания столбца в коде.

 protected override void OnInitialized(EventArgs e) 
     { 
      base.OnInitialized(e); 

      CloneColumn.Visibility = ShowCloneColumn ? Visibility.Visible : Visibility.Hidden; 
     } 

     private DataGridTemplateColumn _cloneColumn; 
     private DataGridTemplateColumn CloneColumn 
     { 
      get 
      { 
       if (_cloneColumn == null) 
       { 
        _cloneColumn = new DataGridTemplateColumn 
        { 
         Header = string.Empty, 
         Visibility = ShowCloneColumn ? Visibility.Visible : Visibility.Hidden 
        }; 
        FrameworkElementFactory buttonFactory = new FrameworkElementFactory(typeof (Button)); 
        buttonFactory.SetValue(Button.ContentProperty, "Clone"); 
        buttonFactory.AddHandler(Button.ClickEvent, new RoutedEventHandler(CloneButtonClicked)); 
        DataTemplate textTemplate = new DataTemplate {VisualTree = buttonFactory}; 
        _cloneColumn.CellTemplate = textTemplate; 
        Columns.Add(_cloneColumn); 
       } 
       return _cloneColumn; 
      } 
     } 
Смежные вопросы