WPF中的数据绑定和触发器兼容性
我有个问题。我为WPF中的数据绑定和触发器兼容性,wpf,data-binding,datatemplate,datatrigger,Wpf,Data Binding,Datatemplate,Datatrigger,我有个问题。我为TreeView制作了一个DataTemplate,需要根据我的型号设置ToggleButton的IsChecked属性的初始值。但事实证明,使用触发器/设置器设置此属性会禁用数据绑定 是这样吗?如果是,请给我一个如何修复的建议 <DataTemplate x:Key="CellTemplate_Name"> <DockPanel x:Name="dock"> <ToggleButton x:Name="Expander"
TreeView
制作了一个DataTemplate
,需要根据我的型号设置ToggleButton
的IsChecked
属性的初始值。但事实证明,使用触发器/设置器设置此属性会禁用数据绑定
是这样吗?如果是,请给我一个如何修复的建议
<DataTemplate x:Key="CellTemplate_Name">
<DockPanel x:Name="dock">
<ToggleButton x:Name="Expander"
IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}"> <--- Binding
...
<ToggleButton/>
...
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=ObjIsOpened, Converter={StaticResource DebugConverter}}" Value="true"> <--- Trigger
<Setter TargetName="Expander" Property="IsChecked" Value="true"></Setter>
</DataTrigger>
...
</DataTemplate.Triggers>
</DataTemplate>
我怀疑它们没有禁用数据绑定,它们只是具有更高的优先级。与其同时使用绑定和触发器,为什么不使用其中一个(绑定或触发器)?例如,您可以直接绑定到模型,并且根本不使用触发器…我怀疑他们没有禁用数据绑定,他们只是具有更高的优先级。与其同时使用绑定和触发器,为什么不使用其中一个(绑定或触发器)?例如,您可以直接绑定到模型,并且根本不使用触发器…首先,我建议您阅读Josh Smith的优秀文章
基于那篇文章,我建议为TreeViewItem
定义一种样式(使用TreeView
的ItemContainerStyle
属性),将其IsExpanded
属性绑定到模型对象的objisOpen
属性。然后扔掉你的扳机
例如:
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded"
Value="{Binding ObjIsOpened, Converter={StaticResource DebugConverter}}"/>
</Style>
<DataTemplate x:Key="CellTemplate_Name">
<DockPanel x:Name="dock">
<ToggleButton x:Name="Expander"
IsChecked="{Binding Path=IsExpanded,
RelativeSource={RelativeSource
AncestorType={x:Type TreeViewItem}}}"> <--- Binding
...
<ToggleButton/>
...
</DataTemplate>
首先,我建议你读一下乔希·史密斯的优秀文章
基于那篇文章,我建议为TreeViewItem
定义一种样式(使用TreeView
的ItemContainerStyle
属性),将其IsExpanded
属性绑定到模型对象的objisOpen
属性。然后扔掉你的扳机
例如:
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded"
Value="{Binding ObjIsOpened, Converter={StaticResource DebugConverter}}"/>
</Style>
<DataTemplate x:Key="CellTemplate_Name">
<DockPanel x:Name="dock">
<ToggleButton x:Name="Expander"
IsChecked="{Binding Path=IsExpanded,
RelativeSource={RelativeSource
AncestorType={x:Type TreeViewItem}}}"> <--- Binding
...
<ToggleButton/>
...
</DataTemplate>
是的,最好的解决方案是直接绑定到模型,但我已经将该属性绑定到另一个属性。是否可以将两个以上的属性绑定在一起?Id如果是,如何在XAML中完成?我刚刚发现了一些关于多重绑定的东西。是的,有多重绑定。但若你们能从模型中设定值,你们为什么要用它呢?模型知道当前状态,对吗(例如,对象刚刚创建,应该展开。)?问题是我使用自己的切换按钮istead作为TreeView的标准展开器,它们必须绑定在一起。此外,我需要为它们设置初始值。因此,我需要绑定三个不同的属性。是否正确?是和否:)。如果您想拥有自己的扩展器而不是原始扩展器,那么您选择了错误的位置。请参考Aviad的答案。这是正确的方法。我知道我可以设计原始扩展器的样式,但在我的情况下,这是不可能的,因为原始扩展器必须隐藏。对我来说,唯一的方法是在我需要的位置上创建一个切换按钮,并将其绑定到隐藏的扩展器。这就是为什么,我认为多重绑定对我来说是最好的解决方案。但是,我将尝试重新设计我的控件,并让您知道我的进度。=)塔克斯!是的,最好的解决方案是直接绑定到模型,但我已经将该属性绑定到另一个属性。是否可以将两个以上的属性绑定在一起?Id如果是,如何在XAML中完成?我刚刚发现了一些关于多重绑定的东西。是的,有多重绑定。但若你们能从模型中设定值,你们为什么要用它呢?模型知道当前状态,对吗(例如,对象刚刚创建,应该展开。)?问题是我使用自己的切换按钮istead作为TreeView的标准展开器,它们必须绑定在一起。此外,我需要为它们设置初始值。因此,我需要绑定三个不同的属性。是否正确?是和否:)。如果您想拥有自己的扩展器而不是原始扩展器,那么您选择了错误的位置。请参考Aviad的答案。这是正确的方法。我知道我可以设计原始扩展器的样式,但在我的情况下,这是不可能的,因为原始扩展器必须隐藏。对我来说,唯一的方法是在我需要的位置上创建一个切换按钮,并将其绑定到隐藏的扩展器。这就是为什么,我认为多重绑定对我来说是最好的解决方案。但是,我将尝试重新设计我的控件,并让您知道我的进度。=)塔克斯!你好,阿维德。谢谢你的回答,效果很好。但它不会修改我的模型中的值。因此,如果defaul的ObjIsOpened=true,则刷新后每个TreeViewItem都会展开。我想多重绑定会有帮助吗?您认为呢?到底是什么问题,单击切换按钮不会更改ObjsOpen,或者更改代码中的ObjsOpen不会影响GUI?如果是前者,请尝试将Mode=TwoWay
添加到绑定中,如果是后者,则必须在模型中实现某种更改通知,最常见的方法是在类上实现INotifyPropertyChanged
,并且只要设置了ObjistOpen,就会触发该事件。我的坏。。。“Mode=TwoWay”解决了这个问题。您好。谢谢你的回答,效果很好。但它不会修改我的模型中的值。因此,如果defaul的ObjIsOpened=true,则刷新后每个TreeViewItem都会展开。我想多重绑定会有帮助吗?您认为呢?到底是什么问题,单击切换按钮不会更改ObjsOpen,或者更改代码中的ObjsOpen不会影响GUI?如果是前者,请尝试将Mode=TwoWay
添加到绑定中,如果是后者,则必须在模型中实现某种更改通知,最常见的方法是在类上实现INotifyPropertyChanged
,并且只要设置了ObjistOpen,就会触发该事件。我的坏。。。“Mode=TwoWay”解决了这个问题。