Привязка данных / PropertyChanged Уведомление о переназначении объекта (Silverlight 4 / C #) - PullRequest
0 голосов
/ 22 июля 2010

У меня есть текстовый блок, связанный с объектом. Двухстороннее связывание работает хорошо и как ожидалось.

В коде позади:

txtNumberOfPlayers.DataContext = tournament.ChipSet;

В .xaml:

 <toolkit:NumericUpDown x:Name="txtNumberOfPlayers" Value="{Binding NumberOfPlayers, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" />

В классе Chipset я выдаю уведомление об изменении, когда установлено NumberOfPlayers (OnPropertyChanged("NumberOfPlayers");)

Но ... когда я полностью переназначаю объект, он не обновляет пользовательский интерфейс, пока я не вызову назначение datacontext снова. Например, допустим, я загружаю другой объект набора микросхем.

Chipset newChipSet = LoadChipset();
tournament.ChipSet = newChipSet;

Это не обновляет txtNumberOfPlayers, когда присваивание выполнено. Это работает только если я делаю это:

Chipset newChipSet = LoadChipset();
tournament.ChipSet = newChipSet;
//have to call this again which seems redundant
txtNumberOfPlayers.DataContext = tournament.ChipSet;

Так что я подумал, может быть, мне нужно поместить уведомление об изменении в объект Chipset следующим образом:

private Chipset chipset;
public Chipset ChipSet
{
    get { return chipset; }
    set
    {
        if (chipset != value)
        {
            chipset = value;
            OnPropertyChanged("ChipSet");
        }
    }
}

но это не работает.

Итак, мои вопросы: как мне обновить пользовательский интерфейс, когда я назначаю новый объект старому без повторного связывания текста данных.

Спасибо!

1 Ответ

0 голосов
/ 22 июля 2010

Вы должны указать RelativeSource для своей привязки:

Value={Binding NumberOfPlayers, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YourNamespace:YourTypeContainingChipsetProperty}}}

EDIT

Пример DependencyProperty в вашем случае. Измените YourCustomControl на имя класса вашего элемента управления:

public static DependencyProperty ChipsetProperty = 
                                    DependencyProperty.Register("Chipset", typeof(Chipset),
                                                                                               typeof(YourCustomControl),
                                                                                               new FrameworkPropertyMetadata
                                                                                                   (null,
                                                                                                    FrameworkPropertyMetadataOptions
                                                                                                        .
                                                                                                        BindsTwoWayByDefault, ChipsetPropertyChangedCallback));

public Chipset Chipset
        {
            get { return (Chipset)GetValue(ChipsetProperty); }
            set { SetValue(ChipsetProperty, value); }
        }

private static void ChipsetPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var yourCustomControl = d as YourCustomControl;
            if (yourCustomControl != null)
            {
                //your logic on property changed goes here; don't raise OnPropertyChanged!
            }
        }
...