如何访问文本块中的值

本文关键字:文本 何访问 访问 | 更新日期: 2023-09-27 18:30:48

我有一个包含以下元素的窗口,我正在尝试访问<TextBlock Name="armingValue"中包含的值,但在我的 .xaml.cs 文件中似乎无法识别它。

我需要做什么才能访问该值?

<Window.Resources>
    <DataTemplate DataType="{x:Type ArmingVM:ArmingItem}">
        <CheckBox Margin="10,5" IsChecked="{Binding IsSet}" Content="{Binding Name}"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type ArmingVM:ArmingBindingData}">
        <DockPanel>
            <ItemsControl ItemsSource="{Binding ArmingItems}" HorizontalAlignment="Left">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
            <TextBlock Text="Enum Value: " HorizontalAlignment="Right"/>
            <TextBlock Name="armingValue" Text="{Binding Value}" HorizontalAlignment="Right"/>
        </DockPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="193*" />
        <ColumnDefinition Width="551*" />
    </Grid.ColumnDefinitions>
    <Button Content="Get Panel Options" Name="btnGetOptionsConfigruation" Margin="12,12,23,396" Click="btnGetOptionsConfigruation_Click"></Button>
    <StackPanel Grid.Column="1" Height="325" HorizontalAlignment="Left" Margin="68,43,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="438">
        <ItemsControl Name="armingItemsControl" ItemsSource="{Binding}"/>
    </StackPanel>
</Grid>

如何访问文本块中的值

Visual Studio 在 .xaml.cs 文件中生成的支持变量仅针对特定情况生成。用户控件主体中的任何"命名"元素都将具有生成的支持变量。但是,不会生成模板中的命名元素。这是因为Visual Studio无法知道你的模板将如何使用。例如,ItemsControl可以使用您的模板来生成多个模板实例。在这种情况下,应该在.xaml.cs内生成什么?

您有两种选择:

  1. 使用绑定,以便将 TextBlock.Text 属性的状态绑定到视图模型,这样就不必直接访问 TextBlock 元素。
  2. "遍历"可视化树以在运行时定位TextBlock

对于(2),我建议使用Linq-to-VisualTree,您可以在其中找到TextBlock,如下所示:

TextBlock block = layoutRoot.Descendants<TextBlock>()
                            .Cast<TextBlock>().Where(tb => tb.Name="armingValue")
                            .Single();

您不需要访问文本框值,而是访问其绑定值。所以考虑到你有XAML

 <TextBlock Name="armingValue" Text="{Binding Value}" HorizontalAlignment="Right"/>

您需要阅读Value

始终避免直接在 WPF 中访问 UI 元素,因为有时(不是那么罕见的情况)如果不是不可行(我的意思是无法保证的方式),找到它们会变得非常棘手。访问它们背后的数据

也许我不明白这一点,但为什么不创建一个绑定到文本框并将其标记为双向?

<TextBlock Text="Enum Value: " HorizontalAlignment="Right" Text="{Binding Value, Mode=TwoWay}"/>