1

アプリの実行中にさまざまなオブジェクトのプロパティを編集できるデバッグ ウィンドウを作成したいと考えています。これにより、たとえば、再構築やアプリの再起動を必要とせずに、アプリの特定のヒューリスティック ルールのしきい値を微調整できます。

目標は、オブジェクトのいくつかのプロパティを編集できるようにデバッグ ウィンドウに指示することです。次に、ウィンドウはプロパティの値を取得し、オブジェクトへの弱い参照を保持し、(値の型に基づいて) 適切なデータ テンプレートを表示して、必要に応じて値を編集し、新しい値をオブジェクトに適用できるようにします。

問題:

データ テンプレートが正しく適用され、各デバッグ項目の値が に表示されますTextBox。ただし、がバインドされているValue各 のプロパティは更新されませんそのプロパティのセッターにブレークポイントを設定しました。ブレークポイントがトリガーされることはありません。DebugItemTextBox

これが私の現在の設定です:

  • ビュー モデルにオブジェクトのDebugItemsコレクションがあります。DebugItem
  • それぞれに typeDebugItemValueプロパティがありますobject
  • デバッグの目的で、Valueプロパティには常に文字列が含まれます。
  • DebugItemタイプとタイプのデータ テンプレートを作成しましたSystem:String
  • 私のウィンドウには、コレクションにListBoxバインドされた が含まれており、上で定義したデータ テンプレートを ContentPresenter に使用して を表示します。そのデータ テンプレート内の Aにバインドされるため、上記で定義された別のデータ テンプレートを使用して文字列値を編集できます*DebugItemsDebugItemTextBoxValueSystem:String

*これが編集が機能しない理由に関係しているという印象を受けました。私は間違っている可能性があります。

ウィンドウの関連部分:

<Grid Background="#CECECE">
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
        <ItemsControl ItemsSource="{Binding DebugItems}" Background="Transparent" BorderBrush="Transparent" />
    </ScrollViewer>
</Grid>

私のデータテンプレート:

(特に興味深いのは、内部ContentPresenterとその埋め込みSystem:Stringデータ テンプレートです。)

<DataTemplate DataType="{x:Type Debug:DebugItem}">
    <Grid Height="60" d:DesignWidth="403.06">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="140" />
                <ColumnDefinition Width="181*" />
                <ColumnDefinition Width="110" />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="{Binding Label}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="14,0,0,0" Foreground="Black" FontWeight="Bold" />
            <ContentPresenter VerticalAlignment="Center" Grid.Column="1" Content="{Binding Value}" Height="Auto">
                <ContentPresenter.Resources>

                    <!-- String -->
                    <DataTemplate DataType="{x:Type System:String}">
                        <TextBox Text="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>

                </ContentPresenter.Resources>
            </ContentPresenter>
            <UniformGrid Grid.Column="2" Rows="1">
                <Button Margin="8,8,0.5,8" Command="{Binding UpdateCommand}" Style="{DynamicResource ButtonStyle}" Content="Update" />
                <Button Margin="4.5,8,8,8" Command="{Binding ApplyCommand}" Style="{DynamicResource ButtonStyle}" Content="Apply" />
            </UniformGrid>
        </Grid>
    </Grid>
</DataTemplate>

何か案は?

4

0 に答える 0