2015-06-08 4 views
1

Я провел утро, глядя на связанные сообщения, НИ ОДНО из них я нашел адрес точной проблемы, с которой я столкнулся, хотя я узнал немного больше по пути.Как связать видимость столбца datagrid в пользовательском элементе управления wpf?

(с использованием MVVM с пользовательскими элементами управления в WPF)

Сценарием: мне нужно создать многоразовый контроль, который представляет собой DataGrid, который показывает два или три столбца, в зависимости от требований в отношении формы. У меня есть настраиваемый элемент управления, который я уже создал, а также свойство зависимостей для скрытия/отображения этой опции в третьей колонке:

* Примечание: эта видимость зависит полностью от того, к чему я установил свойство, мне это никогда не нужно для изменения в зависимости от выбора в других областях.

public class MyCustomControl: Control 
{ 
    public static readonly DependencyProperty DisplayThirdColumnProperty = DependencyProperty.Register(
                         "DisplayThirdColumn", 
                         typeof(bool), 
                         typeof(MyCustomControl), 
                         new FrameworkPropertyMetadata(false)); 

    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether the the third column should display. 
    /// </summary> 
    public bool DisplayThirdColumn 
    { 
     get 
     { 
      return (bool)this.GetValue(DisplayThirdColumnProperty); 
     } 
     set 
     { 
      this.SetValue(DisplayThirdColumnProperty, value); 
     } 
    } 
} 

Вот xaml.Generic:

<CheckBoxColumn Binding="{Binding StuffInThirdColumn}" 
       Header="ThirdColumn" 
       Visibility="{Binding DisplayThirdColumn, 
       Converter={StaticResource BooleanToVisibilityConverter},RelativeSource={RelativeSource TemplatedParent}}"/> 

Теперь, когда я потребляю контроль:

<MyControls:MyCustomControl DisplayThirdColumn="False"/> 

Мои извинения, если мой 'newbieness' показывает, но я что-то отсутствует очевидно здесь? Когда я устанавливаю свойство Visiblity к свернутой явно на контроле xaml.Generic, он правильно скрывает столбец:

<CheckBoxColumn Visibility="Collapsed"..../> 

окно Output, кажется, указывает, что не могу найти элемент, чтобы применить его к.

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

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=DisplayThirdColumn; DataItem=null; target element is 'CheckBoxColumn' (HashCode=19379515); target property is 'Visibility' (type 'Visibility')

+1

Колонка не лежит в одном визуальном дереве, следовательно, не может наследовать DataContext. Вы можете найти решение здесь: http://stackoverflow.com/questions/22073740/binding-visibility-for-datagridcolumn-in-wpf – Aloraman

ответ

3

Спасибо всем за ваши комментарии и ввод, и за минуту (я всегда ценю любое время, которое вы принимаете!)

Вот конечный результат, то, что в конечном итоге работает в случае, если кто-то работает в этой:

This post помог много, но синтаксис мне нужен был отсутствующий относительный источник для TemplatedParent:

(1) Я использую расходный элемент управления и хотел бы иметь возможность устанавливать эту видимость при реализации элемента управления. Вы можете перейти в контекст ViewModel, используя шаги в упомянутой выше записи.

(2) Вам необходимо поместить привязку Относительный источник в TemplatedParent на прокси-сервер или на фиктивный элемент (это была та часть, которую я отсутствовал).

... In a ControlTemplate: 

    <FrameworkElement x:Name="dummyElementToGetDataContext" 
         DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
         Visibility="Collapsed" /> 
     <DataGrid> 
      <DataGrid.Columns> 
      ...... 
      <CheckBoxColumn Binding="{Binding SecondColumnStuff}" 
          Visibility="{Binding DataContext.ShouldDisplaySecondColumn, 
             Converter={StaticResource BooleanToVisibilityConverter}, 
             Source={x:Reference dummyElementToGetDataContext}}" 



............. 

ИЛИ

Создание прокси и при объявлении этого в качестве ресурса, установить обязательный относительный источник шаблонного родителя:

<DataGrid.Resources> 
    <controls:ControlProxy x:Key="ControlProxy" Control="{Binding RelativeSource={RelativeSource TemplatedParent}}"/> 
</DataGrid.Resources> 
+1

Вы также должны отметить ваш ответ как принятый ответ в случае, если кто-то другой столкнется с вашей проблемой. –

0

Свойство Видимость не принимает значение «False» как возможное значение. Если вы хотите, чтобы скрыть свой контроль, вам необходимо либо написать:

<CheckBoxColumn Visibility="Collapsed"/> 

или

<CheckBoxColumn Visibility="Hidden"/> 

Если вы хотите установить видимость в C# код, написать:

yourObject.Visibility = Visibility.Collapsed; 

Если вам нужна дополнительная информация о свойстве видимости и всех его возможных значениях, вы должны пойти здесь: https://msdn.microsoft.com/en-us/library/system.windows.visibility(v=vs.110).aspx

+0

Обновлено исходное сообщение для удаления опечатки 'Visibility =" False "' –

1

Я бы привязал свойство видимости к логическому в ViewModel и использовал VisibilityConverter, см. http://www.codeproject.com/Tips/285358/All-purpose-Boolean-to-Visibility-Converter.

Это означает, что если логическое свойство, которое мы связываем, равно true, оно будет преобразовано в Visibility.Visible, а если false, Visibility.Collapsed.