繁体   English   中英

WPF:从代码隐藏中的 ListView DataTemplate 获取控制

[英]WPF: Get control from ListView DataTemplate in Code Behind

我用自制的 ItemTemplate 创建了一个 ListView,它非常嵌套:

<ListView x:Name="QuestionListView" ItemsSource="{Binding QuestionList, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Background="#afafaf" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
            <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <ContentPresenter />
                </ControlTemplate>
            </Setter.Value>
            </Setter>
        </Style>
        </ListView.ItemContainerStyle>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,5,0,0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="8*" />
                            <ColumnDefinition Width="2*" />
                        </Grid.ColumnDefinitions>
                    <Border Grid.Column="0" CornerRadius="15,0,0,15" BorderBrush="Gray" BorderThickness="0,0,1,0" Background="#676767" />
                    <Border Grid.Column="1" BorderBrush="Gray" BorderThickness="0,3,1,3" Background="#8f8f8f" />
                    <Border Grid.Column="2" CornerRadius="0,15,15,0" BorderThickness="1" BorderBrush="Gray" Background="#676767" />

                    <Label Content="{Binding ID}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontWeight="Bold" Foreground="Beige" />

                    <!--This is the TextEditor, I need in my Code behind-->
                    <Viewbox Grid.Column="1">
                        <avalonEdit:TextEditor xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit" Name="textEditor" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Width="600" FontSize="30" Background="Transparent" BorderBrush="Transparent" Foreground="Beige" PreviewLostKeyboardFocus="RichTextBox_PreviewLostKeyboardFocus" FontFamily="Consolas">
                            <i:Interaction.Behaviors>
                                <beh:AvalonEditBehaviour GiveMeTheText="{Binding TextQuestion, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                            </i:Interaction.Behaviors>
                        </avalonEdit:TextEditor>
                    </Viewbox>

                <!--<TextBlock Grid.Column="1" IsHitTestVisible="False" FontSize="25" FontWeight="Bold" Foreground="LightGray" Text="Your question here" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="Visibility" Value="Collapsed" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding TextQuestion, Mode=TwoWay}" Value="">
                                    <Setter Property="Visibility" Value="Visible" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>-->

                <StackPanel Orientation="Horizontal" Grid.Column="2" HorizontalAlignment="Center">
                    <Button Margin="10,0,5,0" Width="40" Height="40" Background="Gray" Command="{Binding EditCommand}" MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave">
                        <Image Source="{Binding EditImage}" />
                    </Button>
                    <Button Margin="5,0,10,0" Width="40" Height="40" Background="Gray" Command="{Binding DeleteCommand}">
                        <Image Source="{Binding DeleteImage}" />
                    </Button>
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListView>

现在我想在后面的代码中获取 TextEditor textEditor ,因为我正在自定义“Intellisense”window 需要它。

所以我在我的代码后面有这个:

public partial class QuestionListUC : UserControl
{
    TextEditor editor;

    public QuestionListUC()
    {
        InitializeComponent();
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        var template = QuestionListView.Template;
        editor = (TextEditor)template.FindName("textEditor", QuestionListView);
    }
}

但是 FindName-Method 对我没有任何输出,变量“编辑器”是 null。

我在这里做错了什么?

     private void UserControl_Loaded(object sender, RoutedEventArgs e)
     {
        Dispatcher.BeginInvoke(new Action(() => {
            var template = QuestionListView.ItemTemplate;
            editor = (TextEditor)template.FindName("textEditor", 
                   QuestionListView);
            }), DispatcherPriority.DataBind);
     }

这应该工作

最重要的变化是

var template = QuestionListView.ItemTemplate;

Dispatcher 只是延迟操作直到数据绑定完成,所以 ItemTemplate 不应该是 null

我设法在编辑器周围获得了一个 ViewBox,然后只使用它的孩子。 现在我可以控制我的 CB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM