Как некоторые из вас заметили, в WPF 4 появилась новая функция (?), где механизм привязки данных может передавать экземпляры ваших пользовательских элементов управления класса MS.Internal.NamedObject с именем " {DisconnectedItem}» в DataContext — вместо элемента данных, ожидаемого вашим кодом (это происходит, когда шаблонный элемент управления отключается его ItemsControl). Это так называемые сторожевые объекты.
В существующем коде это может привести к ложным исключениям, если код к этому не подготовлен. Они могут быть поглощены подсистемой привязки данных или нанести ущерб. Следите за консолью отладки.
Во всяком случае, я узнал об этом на этот форум MSDN. И есть сообщение Сэма Бента, в котором 4309-a793-4001488b23aa" rel="noreferrer">все это объясняет. Прочитайте это сейчас, вы захотите это узнать. Суть в том, что эти события никогда не должны были срабатывать (это баг), поэтому:
Игнорируйте событие DataContextChanged, если DataContext является дозорным объектом.
Итак, я хочу проверить свой DataContext. Но как? Рассмотреть возможность:
public bool IsSentinelObject(object dataContext)
{
return (dataContext is MS.Internal.NamedObject);
}
Угадайте, что происходит? Он не компилируется, потому что MS.Internal.NamedObject является внутренним и недоступным для меня. Конечно, я могу взломать это так:
public bool IsSentinelObject(object dataContext)
{
return dataContext.GetType().FullName == "MS.Internal.NamedObject"
|| dataContext.ToString() == "{DisconnectedObject}";
}
(или что-то, что работает). Я также последовал предложению Сэма кэшировать объект для последующих проверок равенства ссылок (это синглтон).
Конечно, это означает, что у меня нет проблем, на самом деле. Но мне любопытно, и эта публикация наверняка принесет пользу некоторым пользователям, так что все равно стоит спросить:
Есть ли способ точно сравнить тип с внутренним типом NamedObject, не прибегая к сравнению строк?
DataContextChanged
больше не вырос в .NET 4.5. когда будет передан {DisconnectedObject}.. - person Steven Jeuris   schedule 18.03.2015DataContext
к внутреннему элементу DataContext (композиция модели представления). Обходной путь заключался в том, чтобы просто предотвратить это и обновить все пути привязки доInnerElement.[whathever]
. - person Steven Jeuris   schedule 18.03.2015