Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF中的数据绑定和触发器兼容性_Wpf_Data Binding_Datatemplate_Datatrigger - Fatal编程技术网

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”解决了这个问题。