Я пытаюсь управлять видимостью столбца с помощью флажка (это находится в WPF 4.0).
Вот отрывок моего XAML:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>
<CheckBox x:Name="GeneralDetailsVisible" Content="General Details" Margin="5"/>
<DataGridTextColumn Header="Crew"
Binding="{Binding Path=Crew}"
Visibility="{Binding ElementName=GeneralDetailsVisible,
Converter={StaticResource BoolToVisConverter},
Path=IsChecked}">
</DataGridTextColumn>
Теперь я знаю, что преобразователь BooleanToVisibilityConverter работает, когда я связал его с текстовым блоком, и я вижу значения, которые я ожидаю. Если я ввожу значения вручную в свойство видимости столбцов, оно работает. Но не, когда я связываю его. Что я делаю неправильно?
Ответ:
Quartermeister указал на меня на ответ. Страница, на которую он указал, является немного вводящей в заблуждение, поскольку код, перечисленный на сообщении, не работает, и необходимо посмотреть на пример кода.
Вот мой финал, рабочий код, для кого-либо еще, кто сталкивается с этой проблемой:
Преобразователь для превращения нашего свойства ViewModels bool в корректную Видимость оценивает за наш атрибут столбца.
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>
Свяжите флажок со свойством ViewModels, которое будет управлять столбцами visibiity.
<CheckBox
x:Name="DetailsVisible"
Content="Show Details"
IsChecked="{Binding Path=DisplayDetails}" />
Затем свяжите Видимость со свойством ViewModels DisplayDetails. Заметьте, что это - столбцы собственный DataContext, который связывается с.
<DataGridTextColumn
Header="Reliability"
Binding="{Binding Path=Reliability}"
Visibility="{Binding (FrameworkElement.DataContext).DisplayDetails,
RelativeSource={x:Static RelativeSource.Self},
Converter={StaticResource BoolToVisConverter}}">
</DataGridTextColumn>
Добавьте следующий код к своему проекту, это позволяет ловлю изменения в DataGrids DataContext.
FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn));
FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid),
new FrameworkPropertyMetadata
(null, FrameworkPropertyMetadataOptions.Inherits,
new PropertyChangedCallback(OnDataContextChanged)));
Затем каждый раз, когда Ваш DataGrids DataContext изменяется, мы обновляем весь приложенный DataGridColumsn с новым DataContext.
public static void OnDataContextChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
DataGrid grid = d as DataGrid;
if (grid != null)
{
foreach (DataGridColumn col in grid.Columns)
{
col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);
}
}
}
Один Глюк для внимательности. Если Вы добавляете свой DataContext к Вашей странице как так:
<Window.DataContext>
<vm:WeaponListViewModel />
</Window.DataContext>
Затем вышеупомянутая функция будет вызвана, прежде чем Ваш DataGrid имеет любые столбцы!
Я обошел это путем ручного присоединения моего DataConext в коде позади после того, как окно было создано.
Проблема в том, что колонки DataGrid не являются частью визуального дерева, поэтому они не могут использовать привязки. (Свойство "Binding" на самом деле является обычным свойством типа Binding, а не свойством зависимости. Оно применяет этот объект привязки к ячейкам, которые являются частью визуального дерева.)
Вот ссылка на блог, в котором есть обходной путь и демонстрируется привязка видимости столбца к флажку: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx