【问题标题】:Determine Correct PropertyName for PropertyChanged Event为 PropertyChanged 事件确定正确的 PropertyName
【发布时间】:2012-02-13 07:59:54
【问题描述】:

我正在尝试弄清楚如何准确确定应该在 PropertyChanged 事件中为下面的 TextBlock 的 Text 属性使用什么属性名称。

                    <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));
    }

从后面的代码更改时,IsSelectedIsExpanded 属性都会正确更新。 Text 属性却没有。我尝试在 Name 属性更新时将 null 传递给 OnPropertyChanged(从而强制所有属性更新)并且效果很好, TextBlock 的 Text 属性已正确更新为新值。所以我怀疑也许我在更新 TextBlockText 属性时将错误的字符串作为 propertyName 传递,但我'不确定正确的属性名称应该是什么,或者我将如何弄清楚它。有什么想法吗?

谢谢, 克雷格

【问题讨论】:

  • 当“Name”属性改变时,PropertyChangedEventArg的propertyName应该是......好吧......“Name”:-)它的目的是绑定到'忘记'属性在哪里可能会被绑定。

标签: wpf xaml binding inotifypropertychanged


【解决方案1】:

您需要传递它"Name",因为要更改的属性的名称称为Name

this.OnPropertyChanged("Name");

通过在 Name 属性上引发 PropertyChanged 事件,您是在告诉 WPF 该属性已更改,因此请更新使用该属性的所有绑定。

INotifyPropertyChanged 用于数据模型,而不是 UI 对象。理想情况下,它不应该引用 UI 控件。

IsExpandedIsSelected 之所以使用属性名称,是因为 UI 对象和数据对象中的属性名称相同。这是一种引发 PropertyChanged 通知的可怕方式,因此我建议切换到将实际的属性名称传递给它,而不是 UI 对象的某些属性名称。

【讨论】:

  • 如果你有时间,你介意提供一个小例子来说明你的建议将如何实施吗?或者,也许您知道我可以阅读的一个很好的链接?再次感谢。
  • @Craig 您的意思是IsSelectedIsExpanded 属性更改通知?这与Name 相同,但将字符串替换为已更改的任何属性名称。 this.OnPropertyChanged("IsSelected");你可以在MSDN site for INotifyPropertyChanged看到例子
  • 啊,你是指我在 OnPropertyChanged 事件中使用 System.Windows.Controls.TextBlock.TextProperty.Name 吗?对不起,我把它放在那里是为了让它工作,最初我在那里有字符串“Text”,对于 IsSelected/IsExpanded,我实际上使用了字符串文字“IsSelected”和“IsExpanded”。我以为我是在通知 UI 属性它们的绑定已更新,但实际上我是在通知绑定数据属性的所有 UI 属性它已更改,现在我考虑一下这更有意义。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 2021-02-24
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多