アプリの実行中にさまざまなオブジェクトのプロパティを編集できるデバッグ ウィンドウを作成したいと考えています。これにより、たとえば、再構築やアプリの再起動を必要とせずに、アプリの特定のヒューリスティック ルールのしきい値を微調整できます。
目標は、オブジェクトのいくつかのプロパティを編集できるようにデバッグ ウィンドウに指示することです。次に、ウィンドウはプロパティの値を取得し、オブジェクトへの弱い参照を保持し、(値の型に基づいて) 適切なデータ テンプレートを表示して、必要に応じて値を編集し、新しい値をオブジェクトに適用できるようにします。
問題:
データ テンプレートが正しく適用され、各デバッグ項目の値が に表示されますTextBox
。ただし、がバインドされているValue
各 のプロパティは更新されません。そのプロパティのセッターにブレークポイントを設定しました。ブレークポイントがトリガーされることはありません。DebugItem
TextBox
これが私の現在の設定です:
- ビュー モデルにオブジェクトの
DebugItems
コレクションがあります。DebugItem
- それぞれに type
DebugItem
のValue
プロパティがありますobject
。 - デバッグの目的で、
Value
プロパティには常に文字列が含まれます。 DebugItem
タイプとタイプのデータ テンプレートを作成しましたSystem:String
。- 私のウィンドウには、コレクションに
ListBox
バインドされた が含まれており、上で定義したデータ テンプレートを ContentPresenter に使用して を表示します。そのデータ テンプレート内の Aもにバインドされるため、上記で定義された別のデータ テンプレートを使用して文字列値を編集できます*。DebugItems
DebugItem
TextBox
Value
System: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>
何か案は?