Повторно используемые значения элемента управления DataGrid повторяются

Проблема в том, что когда я программно редактирую значения столбца в сетке данных и прокручиваю вниз, эти значения повторяются в следующих ячейках столбца, которые становятся видимыми. Это похоже на ошибку или «эффект» виртуализации, поскольку, когда я ее выключаю, проблема исчезает. Думаю проблема в этом месте:

public void EditedCell(object oItem, string oColumnName, ref List<string> lErrors, object newValue = null)
{
    DataGridRow dgRow = dgDati.ItemContainerGenerator.ContainerFromItem(oItem) as DataGridRow;
    /* In other places, when I call EditedCell(DataGridRow, ...) it works fine.
       The problem shows up only when I call EditedCell(object oItem, ...) */
    EditedCell(dgRow, oColumnName, ref lErrors, newValue);
}

Это экран проблемы. Желтые ячейки программно изменены, и из-за этой проблемы отображаются другие ячейки, содержащие 0000. Когда я читаю данные из DataSource, в DataRows нет этих значений 0000:

введите здесь описание изображения

Также, чтобы установить значение ячейки, я устанавливаю элементы управления ячейкой в ​​ячейке и значение DataRow, чтобы изменить значение и правильно отобразить его:

if (oElement.GetType() == typeof(TextBox))
{
    (oElement as TextBox).Text = newValue.ToString();
}

if (oElement.GetType() == typeof(TextBlock))
{
    (oElement as TextBlock).Text = newValue.ToString();
}

Кто-нибудь видел что-то подобное и знает, как с этим бороться?


person Jānis Gruzis    schedule 16.10.2013    source источник
comment
Цитирование ключевого слова @HighCore: не манипулируйте элементами управления WPF с помощью процедурного кода :) MVVM избавит вас от всей этой головной боли   -  person Omri Btian    schedule 16.10.2013
comment
Как незаметно намекнул @Omribitan, программное управление элементами пользовательского интерфейса не является способом WPF. В общем, вместо этого мы Bind переходим к элементам управления пользовательского интерфейса и манипулируем данными... таким образом у вас будет гораздо меньше проблем.   -  person Sheridan    schedule 16.10.2013
comment
@Omribitan Спасибо за распространение информации =). Теперь я знаю, что я не один.   -  person Federico Berasategui    schedule 16.10.2013
comment
@Omribitan да, я сделал что-то вроде MVVM, и это сработало. Пожалуйста, опубликуйте какой-нибудь ответ, чтобы я мог одобрить.   -  person Jānis Gruzis    schedule 17.10.2013


Ответы (1)


Не манипулируйте элементами управления WPF с помощью процедурного кода. Это не способ WPF. В WPF вы должны манипулировать своими данными, которые привязаны к пользовательскому интерфейсу, вместо того, чтобы напрямую манипулировать пользовательским интерфейсом. Этот шаблон проектирования известен как MVVM и избавит вас от всей этой головной боли. .

person Omri Btian    schedule 17.10.2013