【问题标题】:OnPropertyChange(null) makes hyperlink disappearOnPropertyChange(null) 使超链接消失
【发布时间】: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 原始问题在文本块中有一个超链接。添加表明,即使没有超链接,嵌套成员也会被删除

标签: c# wpf xaml


【解决方案1】:

不要绑定TextBlockText 属性,您还添加了Hyperlink。引发源属性的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>

【讨论】:

  • 一个。我花了一分钟才注意到我的隔离解决方案 b 上的文本块是白色 XD。完美运行。你能解释一下 Text 和 有什么区别吗?
  • 一个TextBlock可以either包含Inline元素,例如RunsHyperlinksstring
猜你喜欢
  • 2010-10-17
  • 2016-11-09
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
相关资源
最近更新 更多