【发布时间】:2021-01-28 18:50:58
【问题描述】:
我想在我的 C#-WPF 应用程序中显示一个包含链接的文本。这些文本是静态的,并且在编译期间是已知的。
以下是我在直接处理 XAML 文件时想要的:
<TextBlock Name="TextBlockWithHyperlink">
Some text
<Hyperlink
NavigateUri="http://somesite.com"
RequestNavigate="Hyperlink_RequestNavigate">
some site
</Hyperlink>
some more text
</TextBlock>
由于使用 MVVM,我想通过依赖属性将 Textblock 绑定到新构造的 Textblock 对象。 XAML 然后看起来像这样:
<StackPanel Grid.Row="1" Margin="5 0 0 0">
<TextBlock Height="16" FontWeight="Bold" Text="Generic Text with link"/>
<TextBlock Text="{Binding Path=TextWithLink, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
在我放置的 ViewModel 中
private void someMethod(){
...
TextWithLink = CreateText();
...
}
private TextBlock(){
TextBlock tb = new TextBlock();
Run run1 = new Run("Text preceeding the hyperlink.");
Run run2 = new Run("Text following the hyperlink.");
Run run3 = new Run("Link Text.");
Hyperlink hyperl = new Hyperlink(run3);
hyperl.NavigateUri = new Uri("http://search.msn.com");
tb.Inlines.Add(run1);
tb.Inlines.Add(hyperl);
tb.Inlines.Add(run2);
return tb;
}
private TextBlock _textWithLink;
public TextBlock TextWithLink {
get => _textWithLink;
set{
_textWithLink = value;
OnPropertyChanged();
}
}
依赖属性设置正在运行,我看到一个新的 TextBlock 被分配给 XAML 控件,但是没有显示任何内容,只有显示的文本读取
System.Windows.Controls.TextBlock
而不是内容。我无法理解我必须更改的内容以显示所需的混合文本。很高兴得到帮助。
【问题讨论】:
-
set => OnPropertyChanged();显然没有设置属性的支持字段。应该是set { _textWithLink = value; OnPropertyChanged(); }。除此之外,您不会在视图模型中使用 TextBlock 实例。 -
正如所说的 DepProp 的设置不是问题,这在发布问题时被遗忘了。为什么我不在我的 Vm 中使用 TextBlock obj?
-
因为它是一个 UI 元素,即一个视图类。搜索 StackOverflow,了解如何将 XAML 中 TextBlock 的 Inlines 属性设置为 InlinesCollection。虽然 Inlines 不是依赖属性,因此不能直接绑定,但有一些解决方法,例如带有附加属性或派生的 TextBlock 类。
-
仅供参考,选择的绑定参数 Mode=OneWay 和 UpdateSourceTrigger=PropertyChanged 是互斥的。 “由于使用 MVVM,我想通过依赖属性将 Textblock 绑定到新构建的 Textblock 对象。” - 你真的了解 MVVM、绑定和 DP 的概念吗? “以下是我在直接处理 XAML 文件时想要做的事情” - 没有任何理智的理由来更改它。