绑定到 WPF 中的代码隐藏 属性

Bind to Code Behind Property in WPF

我希望绑定到我的代码隐藏中的 属性。到目前为止,我所发现的并不能完全帮助我,但它让我到达了现在的位置。

我想做的是将 bool 绑定到 DataTrigger,这样我可以在文件夹名称旁边设置一个“*”,当里面的 table 被删除时已编辑,表示现在可以选择保存。我知道我的事件处理设置正确,因为当我调试时 属性 是我希望的值。

根据我所见,这应该可行,但大多数示例都与设置文本有关。这是包含供参考的绑定的代码块:

<HierarchicalDataTemplate DataType="{x:Type vm:EditableDatabaseNode}" ItemsSource="{Binding Nodes}">
    <StackPanel Orientation="Horizontal">
        <Image Source="Resources\db.png" Style="{StaticResource tvImage}"/>
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Name="tb_modfied" Text=""/>
    </StackPanel>
    <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=IsChanged}" Value="True">
            <Setter TargetName="tb_modfied" Property="Text" Value="*"/>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>

这是我遇到问题的代码块的第 8 行,以防你无法推断它。

编辑:以防你像我一样懒得看评论。 属性 在我后面的代码中是 public 属性。至于绑定相关的错误,有一个 NullReferenceException 因为绑定没有挂钩到任何东西

我的错误是这样说的:

System.Windows.Data Error: 17 : Cannot get 'IsChanged' value (type 'Boolean') from '' (type 'MainWindow'). BindingExpression:Path=IsChanged; DataItem='MainWindow' (Name=''); target element is 'ContentPresenter' (Name='PART_Header'); target property is 'NoTarget' (type 'Object') TargetInvocationException:'System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.

这里有两个问题。

首先,您需要从 <TextBlock> 标签中删除 Text=""

<Tag> 本身定义的属性优先于任何触发值,因此值不会改变。

您可以在 MSDN's page on Dependency Property Precedence

上阅读更多相关信息

第二个问题是触发器本身的绑定。

设置为

Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=IsChanged}"

"go backwards up the visual tree until you find the first Window object, and check the IsChanged property"。除了我很确定 Window class 没有名为 IsChanged 的​​ 属性。

您很可能希望绑定到当前项目的 DataContext,因此您的绑定应该类似于

<DataTrigger Binding="{Binding IsChanged}" Value="True">