Повторно използваните контролни стойности на DataGrid се повтарят

Проблемът е, че когато редактирам програмно стойностите на колона в 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, те нямат тези 0000 стойности в DataRows:

въведете описание на изображението тук

Също така, за да задам стойност на клетка, задавам контроли на клетката в клетката и стойността на 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