Как передать в конвертор значение переменной?

257
19 октября 2021, 07:20

У меня в таблице (WPF DataGrid) строки в зависимости от ряда условий должны иметь свойство IsEnabled True или False. Для анализа условий написал простенький мультиконвертор:

class DisRowConv : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values == null) 
                throw new NotImplementedException();
            else
            {
                DateTime? AvWorkDateID = values[0] as DateTime?;
                DateTime? AvElCom = values[1] as DateTime?;
                if ((AvWorkDateID == null || AvWorkDateID == avWorkDateID) && AvElCom == null)
                    return false;
                else
                    return true;
            }
        }
    }

Переменные AvWorkDateID, AvElCom это поля из БД SQL. Но для анализа необходимо использовать и внешнюю по отношению к конвертеру переменную avWorkDateID, ее я передаю используя DataContext.

public class AvWorkDateToXaml
    {
        public DateTime AvWorkDate { get; set; }
    }
    public partial class BadCanals : Window
    {
        public AvWorkDateToXaml DateToXaml { get; set; }
        DateTime avWorkDateID; // Код нарушения
        public BadCanals(bool AddForm, DataAvZVKDataContext ref_ref, DateTime avWorkDateID)
        {
            InitializeComponent();
            this.AddForm = AddForm;
            this.ref_ref = ref_ref;
            this.avWorkDateID = avWorkDateID;
            DateToXaml = new AvWorkDateToXaml() { AvWorkDate = avWorkDateID };
            this.DataContext = DateToXaml;
        }
}

XAML разметка:

<DataGrid x:Name="canalDataGrid" ItemsSource="{Binding Source={StaticResource canalViewSource}}" RowDetailsVisibilityMode="VisibleWhenSelected">
                        <DataGrid.RowStyle>
                            <Style TargetType="DataGridRow">
                                <Style.Triggers>
                                    <DataTrigger Value="True">
                                        <DataTrigger.Binding>
                                            <MultiBinding Converter="{StaticResource disRowConv}">
                                                <Binding Path="AvWorkDateID"/>
                                                <Binding Path="AvElCom"/>
                                                <Binding Path="AvWorkDate"/>
                                            </MultiBinding>
                                        </DataTrigger.Binding>
                                        <Setter Property="IsEnabled" Value="False"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </DataGrid.RowStyle>
                    </DataGrid>

Не понимаю, почему в конвертер передаются все три значения как Null. В чем я ошибаюсь?

Answer 1

Вышел из положения конструкцией:

private void CanalDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
        {
            Canals canal = (Canals)e.Row.DataContext;
            if ((canal.AvWorkDateID == avWorkDateID || canal.AvWorkDateID == null) && canal.AvElCom == null) e.Row.IsEnabled = true;
            else e.Row.IsEnabled = false;
        }

Хотя непонятно, почему если конвертер привязан к строке, то в object[] values поступают значения Null, а если конвертер привязан колонке в конвертер передаются правильные значения. Буду разбираться дальше.

READ ALSO
Ошибка во время миграции

Ошибка во время миграции

Проект приложение windows service/служба, после какого то момента перестала работать миграция и получаю вот такую ошибку, не могу понять чего он трогает...

153
Ходы фигур в шахматах

Ходы фигур в шахматах

Создал шахматное поле и разрабатываю ходыПоле сделал с помощью грида и заполнил кнопками

143
Собрать консольное приложение как exe

Собрать консольное приложение как exe

Всем привет! Создал консольный проект C#, но после сборки в папке bin/debug лежит папка netcoreapp21

151