Ripetizione dell'elemento database nel WDF FlowDocument
-
06-07-2019 - |
Domanda
Ho un documento di flusso in WPF che assomiglia a questo:
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Paragraph FontFamily="Georgia">
<StackPanel>
<TextBlock Text="{Binding Path=Title}"/>
<TextBlock Text="{Binding Path=AssignedTo}"/>
</StackPanel>
</Paragraph>
</FlowDocument>
invece di dare a DataContext una classe con la proprietà Title e AssignedTo, vorrei dargli un Elenco di quella classe e fare in modo che il documento di flusso mostri ciascuno di questi oggetti. Qualcuno può dirmi come formare l'XAML nel documento di flusso per farlo?
Soluzione
Chissà, forse semplice come il seguente esempio di codice funzionerà per te, Ajma:
<Window x:Class="WpfTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfTest="clr-namespace:WpfTest"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
Title="Bound Inlines Sample" Height="300" Width="300">
<Window.Resources>
<Collections:ArrayList x:Key="array">
<System:String>Hello</System:String>
<System:String>World</System:String>
<System:String>!</System:String>
</Collections:ArrayList>
</Window.Resources>
<Grid>
<FlowDocumentReader>
<FlowDocument>
<Paragraph FontFamily="Georgia">
<ItemsControl ItemsSource="{StaticResource array}"/>
</Paragraph>
</FlowDocument>
</FlowDocumentReader>
</Grid>
</Window>
In caso contrario, puoi sempre creare la tua proprietà collegata e fare qualsiasi cosa tu possa immaginare nella notifica di modifica della proprietà. Ecco un piccolo esempio con controllo Span:
CS:
public class SpanOperations : DependencyObject
{
public static IEnumerable GetInlineSource(DependencyObject obj)
{
return (IEnumerable)obj.GetValue(InlineSourceProperty);
}
public static void SetInlineSource(DependencyObject obj, IEnumerable value)
{
obj.SetValue(InlineSourceProperty, value);
}
public static readonly DependencyProperty InlineSourceProperty =
DependencyProperty.RegisterAttached("InlineSource", typeof(IEnumerable), typeof(SpanOperations), new UIPropertyMetadata(null, OnInlineSourceChanged));
private static void OnInlineSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var span = d as Span;
if (span == null)
{
// It's a demo only. Can work with only spans...
return;
}
span.Inlines.Clear();
var inlines = e.NewValue as IEnumerable;
if (inlines != null)
{
foreach (var inline in inlines)
{
// We assume only inlines will come in collection:
span.Inlines.Add(inline as Inline);
}
}
}
}
XAML
<Window x:Class="WpfTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfTest="clr-namespace:WpfTest"
xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
Title="Bound Inlines Sample" Height="300" Width="300">
<Window.Resources>
<Collections:ArrayList x:Key="array">
<Run>Hello</Run>
<LineBreak/>
<Run>Hello</Run>
<LineBreak/>
<Bold>
<Run>Hello</Run>
</Bold>
</Collections:ArrayList>
</Window.Resources>
<Grid>
<FlowDocumentReader>
<FlowDocument>
<Paragraph FontFamily="Georgia">
<Span WpfTest:SpanOperations.InlineSource="{Binding Source={StaticResource array}}"/>
</Paragraph>
</FlowDocument>
</FlowDocumentReader>
</Grid>
</Window>
Spero che questo aiuti :)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow