PropertyChanged 时 INotifyPropertyChanged

INotifyPropertyChanged when PropertyChanged

我有:

 <Page.Resources>  
    <data:PublishManager x:Key="pubManager"/>
 </Page.Resources>

然后在我的 textBlock 中我使用了这个:

        <TextBlock Grid.Row="2" Canvas.ZIndex="3" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Path=SocialStatus, Mode=TwoWay, Source={StaticResource pubManager}}"></TextBlock>

我的 class PublishManager 看起来像这样:

 public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private string _SocialStatus;
    public string SocialStatus
    {
        get
        {
            return _SocialStatus;
        }
        set
        {
            _SocialStatus = value;
            RaisePropertyChanged("SocialStatus");
        }
    }

为什么当我在我的方法代码中写这样的东西时它对我不起作用?

SocialStatus = "Whosebug";

为什么我的带有 TextBlock 的页面不刷新内容?

问题是您在绑定方案中使用了静态资源。如果发生 属性 更改,则不会监视静态资源。您真的需要将 PublishManager 用作页面资源吗?

如果PublishManager的实例设置为DataContext会更好。

所以首先设置Page.DataContext:

<Page.DataContext>  
    <data:PublishManager/>
</Page.DataContext>

然后绑定到上下文 属性:

<TextBlock Grid.Row="2" Canvas.ZIndex="3" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding SocialStatus}"/>

https://msdn.microsoft.com/en-us/library/cc838207%28v=vs.95%29.aspx

绑定到静态源有效。您只需要确保 data: 映射到正确的命名空间。由于您没有提供完整的 Xaml。你可能想看看这个。

<UserControl x:Class="PublishManager.Page"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:data="clr-namespace:namespace-to-code">

尽管最佳做法是使用 DataContext 使其更易于重用。喜欢Patryk提供的答案。

这里不要使用StaticResource。它们用于资源价值不太可能改变的地方。阅读以下链接:

StaticResource

using StaticResource

如果 SocialStatus 的值总是 Whosebug 然后用那个值声明静态 属性 和你的绑定应该有效。否则你必须创建一个 class 的对象并将其作为数据上下文提供给视图。

或者只在需要时创建数据上下文

<TextBlock Grid.Row="2" Canvas.ZIndex="3" HorizontalAlignment="Center" VerticalAlignment="Center" 
               Text="{Binding Path=SocialStatus, Mode=TwoWay}">
        <TextBlock.DataContext>
            <data:PublishManager/>
        </TextBlock.DataContext>
    </TextBlock>

这也行。