OnPropertyChange(null) 使超链接消失



代码优先(为了这个问题的目的,上TextBox被简化(:

<TextBlock
Style="{StaticResource  FieldNameStyle }"
TextWrapping ="Wrap" Height="33" FontSize="12"
Visibility="Visible"
TextAlignment="Center"
Foreground="#FFFFFF"
Opacity="0.5"                                      
Text="{Binding UnderLineMsg}">      
<Hyperlink  Name="PrivacyNoticeLink2"                                 
Command="{Binding OpenPrivacyNoticeCommand}">   
<TextBlock 
Visibility="Visible"
Name="privacyNoticeText2"
Text="{Binding PrivacyNoticeButtonLabel,FallbackValue='privacy notice' ,UpdateSourceTrigger=PropertyChanged}"/>                        
</Hyperlink> 
</TextBlock>

这是它第一次加载窗口后的样子: 行下味精填充物:链接

窗口中的事件之一触发对

OnPropertyChanged(null);

该方法在窗口中订阅它的所有成员中触发"刷新":

UpdateSourceTrigger=PropertyChanged

一旦调用超链接元素完全消失(使用 Snoop 2.8 验证( 所以在调用之后,它将看起来像这样: 线下味精填充物:

我不知道为什么会发生这种情况。 当前的修复程序是用许多特定的调用替换一般OnPropertyChanged调用,但从长远来看,这不是一个现实的选择。

编辑:将问题隔离到新项目,请注意,当它只是文本块中的文本块时,问题仍然会发生

简单的 XAML,带有一个触发 OnPropertyChanged 的按钮

<Grid>
<Button Click="Meh"   Margin="171,37,153,199">
PRESS ME
</Button>
<TextBlock  Name="WrapperText" Text= "{Binding randomNumber}">
<TextBlock  Name="linkText" Text="{Binding randomNumStr }"></TextBlock>
</TextBlock>
</Grid>

代码隐藏:

public MainWindow()
{
DataContext = new Stuff();
InitializeComponent();
}
public void Meh(object sender, RoutedEventArgs e)
{
//MessageBox.Show(this, "BLA", "caption", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
//MessageBox.Show("FASDFASDFASDF");
(DataContext as Stuff).OnPropertyChanged(null);
//Msg.ShowMessageBox("BLA", "caption", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
}

"视图模型">

public class Stuff : INotifyPropertyChanged
{
public Stuff()
{
rnd = new Random();
}
private Random rnd;
public int randomNumber => rnd.Next(1, 100);
public string randomNumStr => randomNumber.ToString()+"Text";
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
public  virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

请注意我触发属性更改的真正令人作呕的方式。我知道我应该在"东西"类中使用 Icommand,但我想快速隔离问题。在我的原始代码中,它正确完成。

不要绑定还要向其添加HyperlinkTextBlockText属性。引发源属性的PropertyChanged事件将清除Hyperlink

您可以向其添加Run元素,而不是绑定TextBlock本身的Text属性:

<TextBlock
TextWrapping ="Wrap" Height="33" FontSize="12"
Visibility="Visible"
TextAlignment="Center"
Foreground="#FFFFFF"
Opacity="0.5">  
<Run Text="{Binding UnderLineMsg, Mode=OneWay}" />
<Hyperlink  Name="PrivacyNoticeLink2" Command="{Binding OpenPrivacyNoticeCommand}">   
<TextBlock 
Visibility="Visible"
Name="privacyNoticeText2"
Text="{Binding PrivacyNoticeButtonLabel,FallbackValue='privacy notice' ,UpdateSourceTrigger=PropertyChanged}"/>                        
</Hyperlink> 
</TextBlock>

最新更新