2014-02-12 4 views
1

Я не могу заставить мой visibilty конвертер работать. Я думаю, проблема заключается в том, что я устанавливаю соответствующее свойство в конструкторе, поэтому он не подбирает его по линии. Код ниже, любые предложения относительно того, как я могу это исправить?WPF конвертер видимости не стрельба

MainWindowViewModel: (это главная страница, нажав на кнопку откроется второе окно)

var newWindow = new SecondaryWindow 
       { 
        Title = title, 
        DataContext = new SecondaryWindowViewModel{MyData = data, ShowAdditionalColumns = false} 
       }; 
newWindow.Show(); 

Второстепенные окна: Вот соответствующий XAML:

<Window.Resources> 
     <myApp:DataGridVisibilityConverter x:Key="gridVisibilityConverter" /> 
    </Window.Resources> 

<DataGrid ItemsSource="{Binding Path=MyData}" AutoGenerateColumns="False" > 
       <DataGrid.Columns> 
        <DataGridCheckBoxColumn Header="Print" Binding="{Binding Path=IsSelected}"/> 
        <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" IsReadOnly="True"/> 
        <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}" IsReadOnly="True"/> 
        <DataGridTextColumn Header="Lines" Binding="{Binding Path=TotalLines}" IsReadOnly="True" Visibility="{Binding Path=ShowAdditionalColumns, Converter={StaticResource gridVisibilityConverter}}"/> 

И Вторичный код ViewModel :

private bool showAdditionalColumns; 
public bool ShowAdditionalColumns 
{ 
    get { return showAdditionalColumns; } 
    set 
    { 
     showAdditionalColumns= value; 
     NotifyPropertyChanged(() => ShowAdditionalColumns); 
    } 
} 

Вот преобразователь; довольно стандартный материал здесь. Я поставил точку останова в методе convert; и он никогда не ударил:

[ValueConversion(typeof(bool), typeof(Visibility))] 
public class DataGridVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var booleanValue = (bool)value; 
     return booleanValue ? Visibility.Visible : Visibility.Hidden; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Просьба показать код для конвертера видимости. –

+0

Поскольку объект не полностью сконструирован, когда свойство установлено, ничто не может прослушивать событие с измененным свойством. Некоторые сумасшедшие идеи: Есть ли причина, по которой ShowAdditionalColumns не может быть свойством Dependency? Я считаю, что это решило бы проблему. Или вы можете настроить обработчик для события DataContextChanged SecondaryWindow и установить свойство в обработчике ... –

+0

Выдает ли окно вывода что-нибудь? Другое 'DataGridTextColumn' правильно связывается? –

ответ

0

колонны DataGrid «s не являются частью визуального/логического дерева, поэтому они не получают DataContext наследства. Если вы отлаживаете программу, вы увидите ошибку в окне вывода:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element.

Здесь есть несколько вариантов.

  • Используйте это решение: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx
  • Reference некоторый контроль, который имеет соответствующий контекст данных. Проще всего использовать корневой контейнер (например, пользовательский контроль).

    Сначала инициализировать ресурс под названием "Это" в коде (должен вызываться перед InitializeComponent):

    public MyUserControl() 
    { 
        Resources["This"] = this; 
        InitializeComponent(); 
    } 
    

    Затем ссылаться на него в XAML:

    <DataGridTextColumn Visibility="{Binding Source={StaticResource This}, 
            Path=DataContext.ShowAdditionalColumns, 
            Converter={StaticResource gridVisibilityConverter}}" /> 
    

(В качестве примечания , привязка, которую вы предоставляете для данных столбца, работает, потому что она копируется в строку в сетке, где контекст данных задается в элементе данных DataGrid.)

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