0

次の要素を含むウィンドウがあり、含まれている値にアクセスしようとして<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>
4

3 に答える 3

1

Visual Studio によってファイル内に生成されるバッキング変数は.xaml.cs、特定の状況でのみ生成されます。ユーザー コントロールの本体内の「名前付き」要素には、生成されたバッキング変数があります。ただし、テンプレート内の名前付き要素は生成されません。これは、Visual Studio がテンプレートがどのように使用されるかを知る方法がないためです。たとえば、テンプレートを で使用して、ItemsControl複数のテンプレート インスタンスを生成できます。その場合、何を生成する必要があります.xaml.csか?

次の 2 つのオプションがあります。

  1. プロパティの状態がビュー モデルにバインドされるようにバインドを使用して、要素に直接TextBlock.Textアクセスする必要がないようにします。TextBlock
  2. ビジュアル ツリーを「ウォーク」してTextBlock、実行時に場所を特定します。

(2) については、次のように見つけることができるLinq-to-VisualTreeTextBlockを使用することをお勧めします。

TextBlock block = layoutRoot.Descendants<TextBlock>()
                            .Cast<TextBlock>().Where(tb => tb.Name="armingValue")
                            .Single();
于 2012-04-11T10:50:07.280 に答える
0

TextBox値にアクセスする必要はありませんが、バインドされた値にアクセスする必要があります。だからあなたが持っていることを考えるとXAML

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

あなたは読む必要がありますValue

UI要素に直接アクセスすることは常に避けてください。不可能でない場合(つまり、保証されていない方法で)、UI要素を見つけるのが非常に難しい場合WPFがあります(まれなケースではありません)。それらの背後にあるデータにアクセスします。

于 2012-04-11T10:42:39.347 に答える
0

要点がわからなかったかもしれませんが、テキストボックスへのバインディングを作成して双方向としてマークしてみませんか?

<TextBlock Text="Enum Value: " HorizontalAlignment="Right" Text="{Binding Value, Mode=TwoWay}"/>
于 2012-04-11T10:44:56.437 に答える