Определить правильное имя свойства для события PropertyChanged - PullRequest
0 голосов
/ 18 января 2012

Я пытаюсь выяснить, как точно определить, какое имя свойства следует использовать в событии PropertyChanged для свойства Text в TextBlock ниже.

                    <TreeView ItemsSource="{Binding PrimitiveNodes}">
                    <TreeView.ItemContainerStyle>
                        <Style TargetType="{x:Type TreeViewItem}">
                            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                            <Setter Property="FontWeight" Value="Normal" />
                            <Style.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="FontWeight" Value="Bold" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </TreeView.ItemContainerStyle>
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding PrimitiveNodes}">
                                <TextBlock PreviewMouseLeftButtonDown="TextBlock_PreviewMouseLeftButtonDown" ContextMenu="{StaticResource TreeViewItemContextMenu}" PreviewMouseRightButtonDown="TextBlock_PreviewMouseRightButtonDown"
                                           Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>
                </TreeView>

И вот код, который я используюдля свойства Text.

// Called out in the Name property when it is set
this.OnPropertyChanged(System.Windows.Controls.TextBlock.TextProperty.Name);

Вот функция OnPropertyChanged

    public void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

Оба свойства IsSelected и IsExpanded корректно обновляются при изменениииз кода позади.Однако свойство Text этого не делает.Я попытался передать null в OnPropertyChanged , когда свойство Name было обновлено (таким образом, все свойства обновлены), и это работало нормально, Text свойство TextBlock было правильно обновлено с новым значением.Поэтому я подозреваю, что, возможно, я передаю неверную строку как propertyName для свойства Text TextBlock при его обновлении, но я неуверен, какое должно быть правильное имя свойства или как я бы его выяснил.Есть идеи?

Спасибо, Крейг

1 Ответ

1 голос
/ 18 января 2012

Вам нужно передать его "Name", так как имя изменяемого свойства называется Name

this.OnPropertyChanged("Name");

Вызывая событие PropertyChanged для свойства Name, высообщая WPF, что свойство изменилось, обновите все привязки, использующие это свойство.

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

Причина, по которой IsExpanded и IsSelected работают с использованием имени свойства, заключается в том, что имя свойства одинаково как в объекте пользовательского интерфейса, так и в объекте данных.Это ужасный способ получения уведомлений PropertyChanged, поэтому я бы посоветовал перейти к передаче ему фактического имени свойства, а не какого-либо имени свойства объекта пользовательского интерфейса.

...