OnPropertyChange(null)使超链接消失

时间:2018-08-15 13:32:25

标签: c# wpf xaml

代码优先(出于这个问题的目的,简化了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>

这是第一次加载窗口后的外观:msg填充行下的链接:

窗口中的事件之一触发对

的调用
OnPropertyChanged(null);

该方法会在窗口中使用以下方法订阅的所有成员中触发“刷新”:

 UpdateSourceTrigger=PropertyChanged

一次被称为Hyperlink的元素完全消失(使用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,但是我想快速找出问题所在。在我的原始代码中,它已正确完成。

1 个答案:

答案 0 :(得分:2)

不要绑定您还要添加Text的{​​{1}}的{​​{1}}属性。引发source属性的TextBlock事件将清除Hyperlink

您可以向其中添加一个PropertyChanged元素,而不是绑定Hyperlink本身的Text属性:

TextBlock