1

我想创建一个调试窗口,允许我们在应用程序运行时编辑应用程序中各种对象的属性。例如,这将允许我们调整应用程序中某些启发式规则的阈值,而无需重新构建和/或重新启动应用程序。

目标是告诉调试窗口启用编辑对象的某些属性。然后窗口获取属性的值,保持对对象的弱引用,并显示适当的数据模板(基于值的类型),使我们能够在需要时编辑值并将新值应用于对象。

问题:

数据模板已正确应用,并且在TextBox. 但是,绑定到Value的 each 的属性永远不会更新。我在该属性的设置器上设置了一个断点;断点永远不会被触发。DebugItemTextBox

这是我当前的设置:

  • 我的视图模型中有一DebugItemsDebugItem对象。
  • 每个DebugItem都有Valuetype 的属性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>

有任何想法吗?

4

0 回答 0