如何解决如何在UserControl中显示ObservableCollection <string>
|| 我是WPF的新手,我已经找到了一些类似的问题,但是还不太了解最后一部分。我有一个带有ObservableCollection的ViewModel,其中包含错误消息。我想在表单上显示这些内容,并允许用户选择并复制全部或部分消息。 (过去在WinForm应用程序中,我为此使用了RichTextBox,但是我不知道如何在WPF中将其绑定到集合。) 使用以下xaml获得了我的外观,但是没有像RichTextBox那样可以选择和复制的内置方法。有谁知道我应该使用哪个控件,或者是否有办法选择/复制所有TextBlocks的内容,或者将其绑定到RichTextBox的方法? <Grid Margin=\"6\">
<ScrollViewer VerticalScrollBarVisibility=\"Auto\" Height=\"40\" Grid.Column=\"0\" Margin=\"6\">
<ItemsControl ItemsSource=\"{Binding ErrorMessages}\" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text=\"{Binding Mode=OneWay}\" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
[编辑]
@Andrey Shvydky-这不适合发表评论。
我花了一段时间才弄清楚正确的语法(特别是/,东西),但最终我得到了如下所示的Flow Document语法。它在表格上看起来正确,起初似乎支持全选/复制。但是当我在全选/复制后粘贴时,什么也没有显示。有人知道为什么吗?
<Grid Margin=\"6\">
<FlowDocumentScrollViewer>
<FlowDocument >
<Paragraph>
<ItemsControl ItemsSource=\"{Binding ErrorMessages,Mode=OneWay}\" />
<Run Text=\"{Binding /,Mode=OneWay}\" />
</Paragraph>
</FlowDocument>
</FlowDocumentScrollViewer>
</Grid>
解决方法
可能对于生成FlowDocument并在FlowDocumentReader中显示此文档有用。
尝试从本文开始:流文档概述。
生成示例:
void ShowErrors(FlowDocumentReader reader,Exception[] errors) {
FlowDocument doc = new FlowDocument();
foreach (var e in errors) {
doc.Blocks.Add(new Paragraph(new Run(e.GetType().Name)) {
Style = (Style)this.FindResource(\"header\")
});
doc.Blocks.Add(new Paragraph(new Run(e.Message)) {
Style = (Style)this.FindResource(\"text\")
});
}
reader.Document = doc;
}
在此示例中,我为flowdocument中的文本添加了一些样式。请看一下XAML:
<Window x:Class=\"WpfApplication1.MainWindow\"
xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
Title=\"MainWindow\" Height=\"350\" Width=\"525\">
<Window.Resources>
<Style x:Key=\"header\" TargetType=\"{x:Type Paragraph}\">
<Setter Property=\"FontWeight\" Value=\"Bold\"/>
</Style>
<Style x:Key=\"text\" TargetType=\"{x:Type Paragraph}\">
<Setter Property=\"Margin\" Value=\"30,0\"/>
</Style>
</Window.Resources>
<FlowDocumentReader Name=\"reader\">
</FlowDocumentReader>
结果:
, 最简单的方法:
假设您的视图模型实现了INotifyPropertyChange,请为ObservableCollection PropertyChanged事件创建一个事件处理程序。创建一个将可观察大学中的所有项目聚合为单个字符串的属性。只要可观察的集合发生变化,就为您的新财产触发一个通知事件。绑定到该财产
public class ViewModel : INotifyPropertyChange
{
public ViewModel()
{
MyStrings.CollectionChanged += ChangedCollection;
}
public ObservableCollection<string> MyStrings{get;set;}
public void ChangedCollection(args,args)
{
base.PropertyChanged(\"MyAllerts\");
}
public string MyAllerts
{
get
{
string collated = \"\";
foreach(var allert in MyStrings)
{
collated += allert;
collated += \"\\n\";
}
}
}
}
我知道这段代码充满了错误(我是用SO而不是VS编写的),但是它应该给您一些想法。
, 除非您有大量消息,否则一个简单的转换器可能是可行的:
<TextBox IsReadOnly=\"True\">
<TextBox.Text>
<Binding Path=\"Messages\" Mode=\"OneWay\">
<Binding.Converter>
<vc:JoinStringsConverter />
</Binding.Converter>
</Binding>
</TextBox.Text>
</TextBox>
public class JoinStringsConverter : IValueConverter
{
public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
{
var strings = value as IEnumerable<string>;
return string.Join(Environment.NewLine,strings);
}
public object ConvertBack(object value,System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
, <Grid Margin=\"6\">
<ScrollViewer VerticalScrollBarVisibility=\"Auto\" Height=\"40\" Grid.Column=\"0\" Margin=\"6\">
<ItemsControl ItemsSource=\"{Binding ErrorMessages}\" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text=\"{Binding ViewModelMemberRepresentingYourErrorMessage}\" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。