设置没有名称属性的元素的内容

时间:2019-07-04 08:54:16

标签: c# wpf

我将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>

问候和感谢:)

2 个答案:

答案 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 />