Конвертер не срабатывает

У меня ниже DataGridTextColumn в моей сетке данных:

<my:DataGridTextColumn Visibility="{Binding Path=DataContext.Filter, Converter={StaticResource ColumnVisibilityConverter}"> 

Фильтр - это свойство в модели представления:

        private EnumStatus filter;
        public EnumStatus Filter
        {
            get { return filter; }
            set
            {
                if (!filter.Equals(value))
                {
                    filter= value;
                    OnPropertyChanged("Filter");
                }
            }
        }

EnumStatus — это перечисление:

public enum EnumEstatRemesa 
{        
    Pending,
    Approved,
    Reviewing
};

Конвертер:

public class ColumnVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        EnumStatus status = (EnumStatus)value;

        return (status == EnumStatus.Pending) ? Visibility.Visible : Visibility.Collapsed;
    }

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

Создание ресурса в окне:

<Window.Resources>
    <ColumnVisibilityConverter x:Key="ColumnVisibilityConverter"/>
</Window.Resources>

Моя проблема в том, что конвертер никогда не вызывается. Почему?

При отладке окно вывода говорит:

Ошибка System.Windows.Data: 2: не удается найти управляющий элемент FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression:Path=DataContext.Filter; Элемент данных = ноль; целевой элемент — DataGridTextColumn (HashCode=20546761); целевое свойство — «Видимость» (тип «Видимость»)


person Ralph    schedule 15.01.2018    source источник
comment
Что такое DataContext.Filter? Проверьте окно вывода на наличие ошибок привязки. Преобразователь вызывается только в случае успешной привязки к источнику.   -  person Sinatr    schedule 15.01.2018
comment
Ряд несвязанных мыслей: Вы уверены, что Filter точно меняется, и сообщаете об этом изменении? Возможно, стоит явно указать привязку Mode=OneWay. Есть ли ошибки, связанные с привязкой в ​​окне вывода? Вы пытались запустить SnoopWPF для проверки привязки на наличие ошибок во время выполнения?   -  person LordWilmore    schedule 15.01.2018
comment
@Sinatr Показывает ошибку в окне вывода при отладке. Смотрите обновление.   -  person Ralph    schedule 15.01.2018
comment
@LordWilmore Да, свойство Filter меняется и сообщает об изменении с помощью INotifyPropertyChanged. Окно вывода показывает ошибку. Смотрите обновление.   -  person Ralph    schedule 15.01.2018
comment
Свойство — Filter. Тем не менее имя перечисления и поднятого свойства — FiltreEstatRemesa. Это не может работать. Существует синтаксис, чтобы компилятор заполнил имя свойства, начиная с C # 5 или около того. Я предлагаю вам использовать его. Это специально там, поэтому рефакторинг значения свойства не вызывает таких проблем.   -  person Christopher    schedule 15.01.2018
comment
"FiltreEstatRemesa"? Разве это не должно быть nameof(Filter)? И кажется, что вы пропускаете только часть RelativeSource={RelativeSource AncestorType={x:Type DataGrid}} для привязки к модели представления DataGrid.   -  person Sinatr    schedule 15.01.2018
comment
Он ищет свойство Filter в DataGridTextColumn, поэтому контекст данных неверен. Найдите на этом сайте информацию о том, как выполнить привязку к контексту данных другого элемента — по этому поводу есть множество советов.   -  person LordWilmore    schedule 15.01.2018
comment
DataGridColumns на самом деле не находятся в визуальном дереве, поэтому привязка не работает как обычно: stackoverflow.com/questions/22073740/   -  person Dave M    schedule 15.01.2018
comment
@ Кристофер, это была опечатка. Исправленный. Извиняюсь.   -  person Ralph    schedule 15.01.2018
comment
@LordWilmore какой сайт? ссылка пропала?   -  person Ralph    schedule 15.01.2018
comment
@DaveM Да, применение предложенного вами решения работает! Также я видел этот сайт: thomaslevesque.com/2011/03/21/   -  person Ralph    schedule 15.01.2018
comment
@ user1624552 Я имел в виду этот сайт, stackoverflow   -  person LordWilmore    schedule 15.01.2018


Ответы (1)


Я вижу здесь несколько проблем:

  1. Выражение привязки

Удалите «Контекст данных». строка в выражении привязки.

По умолчанию расширение привязки всегда обращается к контексту данных. (Который содержит модель представления)

  1. Контекст данных нулевой

Второе, о чем говорится в сообщении об ошибке, которое вы публикуете, это то, что элемент данных имеет значение null. Кажется, вы не назначили контекст данных. где-то в коде позади вас должно быть, например, что-то вроде

this.DataContext = new MyViewModel();
  1. Столбцы не имеют контекста данных

Столбцы DataGridColumns не находятся в VisualTree, поэтому они не получают контекст данных из родительского DataGrid. Имейте в виду, что для столбцов не назначена модель Element-View. Они существуют независимо от наличия элементов, привязанных к свойству ItemsSource.

Таким образом, ваша привязка должна выглядеть примерно так:

{Привязка DataContext.FilterViewModel[MyCol].Filter,Mode=FindAncestor, AncestorType=DataGrid}

Часть «FilterViewModel [MyCol]» зависит от того, как выглядит ваша модель представления.

Обратите внимание, что вам нужно указать здесь «DataContext», поскольку источником привязки будет DataGrid, а модель представления доступна через свойство DataContext DataGrid. Это случай, когда вам нужно явно указать «DataContext» в привязке.

  1. Намерение

В вашем вопросе не так ясно, каково ваше намерение. Однако, если вы намерены скрыть определенные строки сетки данных: это вообще не работает через ColumnVisibility. (Кажется, вы хотите отфильтровать строки с определенным ApporvalStatus)

person charly_b    schedule 15.01.2018
comment
Мне нравится часть 4. Намерение :) - person grek40; 15.01.2018
comment
Ну, мое намерение состоит в том, чтобы сделать столбец свернутым или видимым в зависимости от значения свойства Filter модели представления. Я решил, применив решение DaveM, также объясненное здесь: не унаследован/" rel="nofollow noreferrer">thomaslevesque.com/2011/03/21/ - person Ralph; 15.01.2018
comment
Ах хорошо . Тогда игнорируйте 4. ;-) - person charly_b; 15.01.2018