PropertyChanged时INotifyPropertyChanged

时间:2016-01-12 15:53:36

标签: c# xaml binding dependency-properties inotifypropertychanged

我有:

 <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>

我的类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 = "StackOverflow";

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

3 个答案:

答案 0 :(得分:3)

问题是您在绑定方案中使用静态资源。在属性改变的情况下,不监视静态资源。您真的需要使用PublishManager作为页面资源吗?

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

首先设置Page.DataContext

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

然后绑定到context属性:

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

答案 1 :(得分:2)

请勿在此处使用StaticResource。它们用于资源价值不太可能发生变化的地方。请阅读以下链接:

StaticResource

using StaticResource

如果 SocialStatus 的值始终为 StackOverflow ,则使用该值声明静态属性,并且绑定应该有效。否则你必须创建一个类的对象,并将其作为datacontext提供给视图。

或者只需在需要时创建一个datacontext

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

这也可以。

答案 2 :(得分:1)

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

绑定到静态源是有效的。您只需要确保数据:映射到正确的命名空间。因为你没有提供完整的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提供的答案一样。