我将ListBox与ObservableCollection结合使用。内容是通过TemplateSelector(TextBlock或Label)设置的。文本必须进行格式化(例如,在后台代码中带有运行标签),但是我无法访问这些项目。有获取元素的解决方案吗?
我尝试了OfType <>的用法,但这仅适用于面板。我搜索了一个儿童属性,但ListBoxes没有一个。对于UId和Name,无法通过绑定设置Name-Property。 用于LogicalChildren的IEnumerator无效,并且每次添加新元素时都对整个内容进行迭代,并不是那么理想。这是一个最小的例子。
<Window.Resources>
<DataTemplate x:Key="TextBlockTemplate">
<StackPanel>
<TextBlock />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="LabelTemplate">
<StackPanel>
<Label/>
</StackPanel>
</DataTemplate>
<local:myTemplateSelector x:Key="myTemplateSelector" x:Name="myTemplateSelector" TextBlockTemplate="{StaticResource TextBlockTemplate}" LabelTemplate="{StaticResource LabelTemplate}"/>
</Window.Resources>
<Grid Margin="0">
<ListBox Name="mylist" Grid.Row="3"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ItemsSource="{Binding _listEntries}"
ItemTemplateSelector="{StaticResource myTemplateSelector}"
>
</ListBox>
</Grid>
问候和感谢:)
答案 0 :(得分:0)
TextBlock
具有Inlines属性,该属性返回构成Inline
内容的TextBlock
元素。
Label
具有Content
属性,您可以根据自己的使用方式将其转换为Panel
。
TextBox
没有内联元素。
答案 1 :(得分:0)
现在,我找到了解决方案。我将TextBlock和Label设置为User Control并设置了Name-property。在后面的代码中,我可以访问DataContext并且该元素可以自行设置。
<UserControl x:Class="Test.TextBlockControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TextBlockControl"
Loaded="UserControl_Loaded">
<Grid>
<StackPanel HorizontalAlignment="Stretch" Margin="0,0,0,0">
<TextBlock Name="textBlock"/>
</StackPanel>
</Grid>
在后面的代码中,我现在可以访问值并设置:
public partial class TextBlockControl : UserControl
{
public List<string> name => DataContext as List<string>;
public TextBlockControl()
{
InitializeComponent();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
foreach (var t in name)
{
var run = new Run(t.Text);
if (t.IsHighlighted)
{
run.Foreground = Brushes.Green;
}
else
{
run.Foreground = Brushes.Red;
}
textBlock.Inlines.Add(run);
}
}
}
}
然后在MainWindow中,dataTemplate引用UserControl(根是名称空间):
<root:PickControl />