如何访问TextBlock中的值?

时间:2012-04-11 10:38:02

标签: c# wpf xaml

我有一个包含以下元素的窗口,我正在尝试访问<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>

3 个答案:

答案 0 :(得分:1)

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

您有两种选择:

  1. 使用绑定,以便TextBlock.Text属性的状态绑定到视图模型,这样您就不必直接访问TextBlock元素。
  2. 'walk'可视化树,以便在运行时找到您的TextBlock
  3. 对于(2),我建议使用Linq-to-VisualTree,您可以在其中找到TextBlock,如下所示:

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

答案 1 :(得分:0)

您无需访问TextBox值,但需要访问绑定值。 所以考虑到你有XAML

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

您需要阅读Value

请始终尝试避免直接在WPF中访问UI元素,因为有时(不是那么罕见的情况)如果不是不可能的话,它会变得真的难以找到它们(我的意思是不保证) 。访问支持它们的数据

答案 2 :(得分:0)

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

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