代码优先(为了这个问题的目的,上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,但我想快速隔离问题。在我的原始代码中,它正确完成。
不要绑定还要向其添加Hyperlink
的TextBlock
的Text
属性。引发源属性的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>