Привязка не работает после установки значения свойства в null - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть DataGrid, который связан с ObservableCollection <"Product">.Столбцы привязаны к свойствам Product.Большинство из них имеют тип double? (Nullable).

Через некоторое время мне нужно установить какое-либо свойство в null.После этого, независимо от того, какое значение я установил, привязка не работает.Значение не обновляется в представлении.

Что происходит с привязкой, когда я устанавливаю свойство в null?

Я пробовал то, что показано в этом сообщении в блоге http://wildermuth.com/2009/11/18/Data_Binding_Changes_in_Silverlight_4, номне это не сработало.

Спасибо!

Редактировать: Ниже приведен класс, который я создал, который реализует INotifyPropertyChanged

public class NotifyPropertyChangedAttribute : INotifyPropertyChanged
{
    Dictionary<string, object> _propBag = new Dictionary<string, object>();
    protected object Get(string propName)
    {
        object value = null;
        _propBag.TryGetValue(propName, out value);
        return value;
    }

    protected void Set(string propName, object value)
    {
        if (!_propBag.ContainsKey(propName) || Get(propName)!=null)
        {
            _propBag[propName] = value;
            OnPropertyChanged(new PropertyChangedEventArgs(propName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        PropertyChanged(this, e);
    }
}    

Это мой продукт класса.Свойство ItemsSource DataGrid связано с набором объектов ObservableCollection:

public class Product : NotifyPropertyChangedAttribute
{

    public string Name
    {
        get { return (string)Get("Name") ?? ""; }
        set { Set("Name", value); }
    }

    public double? Price
    {
        get {return (double)Get("Price") ?? null;}
        set { Set("Price", value);}
    }

    public void Reset()
    {
        var propertyInfo = typeof(Product).GetProperties(BindingFlags.DeclaredOnly     | BindingFlags.Public | BindingFlags.Instance);
        foreach (var p in propertyInfo)
        {
            p.SetValue(this , null, null);
        }
     }  
}

Посмотрите метод Reset ().Привязка перестает работать после вызова этого метода.В моем приложении мне нужно, чтобы, когда пользователь нажимал клавишу «Del», строка DataGrid становилась пустой, но не могла быть удалена.

1 Ответ

1 голос
/ 29 февраля 2012

Если вы установите для ссылки на коллекцию значение null, связь между вашим элементом управления и источником нарушится, потому что источник больше не существует.В этом случае вы должны явно перепривязать источник элементов в элементе управления.

Рекомендуется очистить коллекцию вместо присвоения ей нулевого значения.

Обновление: Для свойств элементов в коллекции убедитесь, что тип элемента реализует INotifyPropertyChanged.Строка в DataGrid будет прослушивать изменения через этот интерфейс в самом классе элементов.

...