2010-10-20 5 views
1

Есть ли способ скрыть данный столбец на основе привязки. Я попытался установить свойство видимости в DataGridTextColumn (используя правильный конвертер), но это не работает. Если я устанавливаю значение напрямую (не через привязку), он работает. То есть видимость столбца - все или ничего не связано с datagrid?WPF Datagrid - установить видимость столбца на строку

ответ

6

Все, что вам действительно нужно сделать, это добавить:

, а затем используются следующие в столбцах:

<DataGridTextColumn CellStyle="{StaticResource vStyle}"/> 
+0

Хорошее мышление :) –

3

Посмотрите на этот пост, проблема объясняется
Binding in a WPF data grid text column
и здесь
http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

Цитирование JaredPar из первого звена
«По существу проблема заключается в том, что DataGridTextColumn не имеет родителя, из которого чтобы наследовать привязку, потому что она не является частью логического или визуального дерева. Вы должны настроить контекст наследования, чтобы получить доступ к информации привязки «

Временное решение для того, чтобы получить эту работу ..

public class DataGridContextHelper 
{ 
    static DataGridContextHelper() 
    { 
     DependencyProperty dp = FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn)); 
     FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid), 
     new FrameworkPropertyMetadata 
      (null, FrameworkPropertyMetadataOptions.Inherits, 
      new PropertyChangedCallback(OnDataContextChanged))); 
    } 

    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); 
      } 
     } 
    } 
} 

public partial class App : Application 
{ 
    static DataGridContextHelper dc = new DataGridContextHelper(); 
} 

<DataGrid x:Name="c_dataGrid" AutoGenerateColumns="False" DataContext="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=SelectedItem}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Visibility="{Binding Path=(FrameworkElement.DataContext), RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource HideColumnAConverter}}" /> 
    </DataGrid.Columns> 
</DataGrid> 

object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value == null) 
    { 
     return Visibility.Visible; 
    } 
    // Whatever you're binding against 
    TestClass testClass = value as TestClass; 
    return testClass.ColumnAVisibility; 
} 
+0

Это работает для всего столбца ... то, что я ищу, это индивидуальный контроль строки. Например, строка 1 имеет 5 столбцов, а строка 2 имеет 4 столбца, потому что одна из них скрыта. – AKoran

+0

Обновлен мой пример, надеюсь, это будет сделано :) Добавлен DataContext = "{Binding RelativeSource = {x: Static RelativeSource.Self}, Path = SelectedItem}" для DataGrid и конвертера для каждого столбца. –

+0

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

Смежные вопросы