Как сделать взаимоисключающие столбцы в таблице данных WPF? - PullRequest
0 голосов
/ 26 июля 2010

Вот моя текущая проблема:

У меня есть сетка данных с четырьмя столбцами: первый год по индексу, первый год по процентам, второй год + по индексу и второй год + по процентам. Я хочу, чтобы моя сетка данных сделала эти столбцы взаимоисключающими со своим аналогичным столбцом.

Так, например, если я введу число для первого года по процентам, мне не разрешат вводить что-либо для первого года по индексу и наоборот. То же самое относится и к столбцам «Год два +» друг с другом.

Я был бы достаточно счастлив, если бы вместо блокировки столбца он удалил значение другого столбца (т. Е. В приведенном выше примере, вместо того, чтобы не иметь возможности редактировать первый год по индексу, сделайте так, чтобы, если вы это сделали, это сотрите значение из первого года в процентах).

Есть идеи?

РЕДАКТИРОВАТЬ: Вот что я пробовал до сих пор: я попытался настроить поле «AllowEdit» соседнего столбца, когда что-то меняется (это ничего не делало), и я попытался очистить значение в другом столбце ( также не удалось).

1 Ответ

1 голос
/ 27 июля 2010

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

public const string YearOneByIndexPropertyName = "YearOneByIndex";
public int YearOneByIndex
{
    get
    {
        return _yearOneByIndex;
    }

    set
    {
        if (_yearOneByIndex  == value)
        {
            return;
        }

        _yearOneByIndex = value;
        _yearOneByPercentage = 0

        RaisePropertyChanged(YearOneByIndexPropertyName);
        RaisePropertyChanged(YearOneByPercentagePropertyName);
    }
}

public const string YearOneByPercentagePropertyName = "YearOneByPercentage";
public int YearOneByPercentage
{
    get
    {
        return _yearOneByPercentage;
    }

    set
    {
        if (_yearOneByPercentage == value)
        {
            return;
        }

        _yearOneByPercentage = value;
        _yearOneByIndex = 0;

        RaisePropertyChanged(YearOneByIndexPropertyName);
        RaisePropertyChanged(YearOneByPercentagePropertyName);
    }
}

Редактировать: Вы также можете добавить некоторые логические свойства для привязки к свойствам IsReadOnly каждого столбца и использовать ту же технику, чтобы установить для альтернативного столбца значение true.

Редактировать: В ходе некоторого тестирования я обнаружил, что необходимо установить привязку UpdateSourceTrigger к столбцу таблицы данных в PropertyChanged. В противном случае описанный выше установочный код не будет работать, пока пользователь не нажмет клавишу ввода или не выберет другую строку.

PS: я использую MVVM-Light, откуда и происходит RaisePropertyChanged.

...