【发布时间】:2018-08-15 13:32:24
【问题描述】:
代码优先(上面的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 调用,但从长远来看这不是一个现实的选择。
编辑: 已将问题隔离到一个新项目,请注意,当它只是文本块中的一个文本块时,问题仍然会发生
带有触发 OnPropertyChanged 的按钮的简单 XAML
<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));
}
}
请注意我触发属性更改的真正令人作呕的方式。我知道我应该在“Stuff”类中使用 Icommand,但我想快速隔离问题。在我的原始代码中,它已正确完成。
【问题讨论】:
-
UpdateSourceTrigger=PropertyChanged对 TextBlock.Text 无能为力。它会影响从视图到视图模型的更新。 TextBlock.Text 不会从视图中改变。UnderLineMsg的更新可能会删除外部 TextBlock 的其他内容 -
明确一点:
UpdateSourceTrigger=PropertyChanged与 INotifyPropertyChanged 接口的PropertyChanged事件无关。你应该删除它。也就是说,您或许应该向我们展示您的 OnPropertyChanged 方法的代码。 -
隔离问题,见编辑
-
@Danw25 为什么在 TextBlock 中有一个 TextBlock?
-
@DipenShah 原始问题在文本块中有一个超链接。添加表明,即使没有超链接,嵌套成员也会被删除