2015-11-10 4 views
0

Я пытаюсь установить и привязать с помощью ToggleButton, чтобы изменить видимость столбцов в DataGrid. I am following this post Проблема заключается в том, что конвертер никогда не срабатывает, и я не знаю, почему.WPF DataGridTemplateColumn set Видимость со связыванием Не работает

Мой код выглядит следующим образом:

<DataGridTemplateColumn Header="My Header" 
         Visibility="{Binding IsChecked, 
            ElementName=AdvancedToggleButton, 
            Converter={StaticResource booleanToVisaulConverter}}" > 
<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
       <!-- Elements removed for brevity--> 
     </StackPanel> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 

Конвертер это

<Page.Resources> 
    <local:BooleanToVisaulConverter x:Key="booleanToVisaulConverter" /> 
</Page.Resources> 

С кодом позади;

public class BooleanToVisaulConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool visibility = (bool)value; 
     return visibility ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Visibility visibility = (Visibility)value; 
     return (visibility == Visibility.Visible); 
    } 
} 

редактировать: @Breeze нашел ошибку, что booleanToVisaulConverter не было на самом деле, указывая на BooleanToVisaulConverter. Это было исправлено, но все равно не стреляло. Спросил код ToggleButton;

<ToggleButton Name="AdvancedToggleButton" Content="Advanced" /> 
+1

Пожалуйста, поделитесь декларацию advancedToggleButton, если ошибка не то, что вы используете BooleanToVisibiltyConverter в вашем статическом ресурсе вместо BooleanToVisaulConverter – Breeze

+0

@Breeze констатировала BooleanToVisaulConverter, см.выше – Xaphann

+0

Там уже BooleanToVisibilityConverter в рамках, FYI. И вы должны использовать такой инструмент, как Snooper, для проверки визуального дерева на предмет ошибок привязки во время выполнения. – Will

ответ

0

Так получается, что если вы установите видимость в заголовок и ячейки столбца он все еще там и не полностью скрыты ... после некоторого копания (никогда не использовал данные сетки перед :)) Я обнаружил, что у вас есть доступ к столбцам от объекта DataGrid поэтому быстрая вещь для работы является:

XAML

<ToggleButton Name="AdvancedToggleButton" 
       Content="Advanced" 
       Click="AdvancedToggleButton_Click" /> 

код позади

private void AdvancedToggleButton_Click(object sender, RoutedEventArgs e) 
{ 
    var newVisibility = (bool)(sender as ToggleButton).IsChecked ? 
     Visibility.Visible : Visibility.Collapsed; 
    this.theDataGrid.Columns[0].Visibility = newVisibility; 
} 

Конечно, вам нужно будет реализовать некоторую логику, чтобы получить соответствующий столбец, а не использовать фиксированный индекс, если вы собираетесь использовать его в реальном коде.

2

Я столкнулся с той же проблемой пару недель назад. Мое решение для этого:

Сначала вам нужно реализовать прокси-класс привязки, который содержит ваш datacontext. Этот класс выглядит следующим образом:

public class BindingProxy : Freezable 
{ 
    public static readonly DependencyProperty DataProperty = DependencyProperty.Register(
     "Data", typeof (object), typeof (BindingProxy), new UIPropertyMetadata(null)); 

    public object Data 
    { 
     get { return GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 
} 

Затем вы определяете страницу-ресурсов создать экземпляр этого связывания прокси, как:

<namespaceOfProxy:BindingProxy Data="{Binding}" x:Key="proxy"/> 

Затем вы можете связать Visiblity из ваших DataGridTemplateColumn свойству в вашем ViewModel со следующим кодом:

Visibility="{Binding Source={StaticResource proxy}, Path=Data.IsToggleButtonChecked, Converter={StaticResource booleanToVisaulConverter}}" 

Это работает для связывания видимость свойства в вашем ViewModel. В вашем случае я бы привязал состояние также к свойству в viewmodel.

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

  • Нет связанных вопросов^_^