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。它们用于资源价值不太可能改变的地方。阅读以下链接:
如果 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>
这也行。
我有:
<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。它们用于资源价值不太可能改变的地方。阅读以下链接:
如果 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>
这也行。