绑定到 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">
我希望绑定到我的代码隐藏中的 属性。到目前为止,我所发现的并不能完全帮助我,但它让我到达了现在的位置。
我想做的是将 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">