我想创建一个调试窗口,允许我们在应用程序运行时编辑应用程序中各种对象的属性。例如,这将允许我们调整应用程序中某些启发式规则的阈值,而无需重新构建和/或重新启动应用程序。
目标是告诉调试窗口启用编辑对象的某些属性。然后窗口获取属性的值,保持对对象的弱引用,并显示适当的数据模板(基于值的类型),使我们能够在需要时编辑值并将新值应用于对象。
问题:
数据模板已正确应用,并且在TextBox
. 但是,绑定到Value
的 each 的属性永远不会更新。我在该属性的设置器上设置了一个断点;断点永远不会被触发。DebugItem
TextBox
这是我当前的设置:
- 我的视图模型中有一
DebugItems
组DebugItem
对象。 - 每个
DebugItem
都有Value
type 的属性object
。 - 出于调试目的,该
Value
属性始终包含一个字符串。 - 我已经为
DebugItem
类型和System:String
类型创建了一个数据模板。 - 我的窗口包含一个
ListBox
绑定到DebugItems
集合并DebugItem
使用上面定义的数据模板在 ContentPresenter 中显示的 s。TextBox
该数据模板内部的A也绑定到 ,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>
有任何想法吗?