Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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
C# 在触发器中,可以测试另一个属性的值吗?_C#_Wpf_Triggers_Conditional Statements - Fatal编程技术网

C# 在触发器中,可以测试另一个属性的值吗?

C# 在触发器中,可以测试另一个属性的值吗?,c#,wpf,triggers,conditional-statements,C#,Wpf,Triggers,Conditional Statements,触发器的值属性是否可以基于元素的属性 例如,在具有滚动条的控件模板中,如果其最小值和最大值属性相等,我试图将其可见性属性设置为折叠的 但是,由于触发器不是依赖对象,因此无法将绑定设置为触发器的值,因此以下操作不起作用 <Trigger Property="Minimum" SourceName="PART_ScrollBar" Value="{Binding Maximum, SourceName=PART_ScrollBar}"> <Setter P

触发器的
属性是否可以基于元素的属性

例如,在具有滚动条的
控件模板中,如果其
最小值
最大值
属性相等,我试图将其
可见性
属性设置为
折叠的

但是,由于
触发器
不是
依赖对象,因此无法将
绑定
设置为
触发器的
,因此以下操作不起作用

<Trigger Property="Minimum"
    SourceName="PART_ScrollBar"
    Value="{Binding Maximum, SourceName=PART_ScrollBar}">

    <Setter Property="Visibility"
        TargetName="PART_ScrollBar"
        Value="Collapsed" />                                

</Trigger>


那么,这可以完全通过触发器来完成,还是必须在代码隐藏中完成呢?

在这种情况下,我建议创建一个自定义行为

像这样

public class MinMaxVisibilityBehavior : Behavior<ScrollBar>
{
    public override void OnAttached()
    {
        DependencyPropertyDescriptor
                .FromProperty(ScrollBar.MaximumProperty, typeof(ScrollBar))
                .AddValueChanged(AssociatedObject, CheckMinMax);
        DependencyPropertyDescriptor
                .FromProperty(ScrollBar.MinimumProperty, typeof(ScrollBar))
                .AddValueChanged(AssociatedObject, CheckMinMax);
    }

    private void CheckMinMax(object sender, EventArgs e)
    {
       AssociatedObject.Visibility = AssociatedObject.Minimum == 
          AssociatedObject.Maximum ? Visibility.Hidden : Visibility.Visible;
    }
}
公共类MinMaxVisibilityBehavior:Behavior
{
公共覆盖无效附加()
{
DependencyPropertyDescriptor
.FromProperty(滚动条.MaximumProperty,类型(滚动条))
.AddValueChanged(关联对象,检查最小值);
DependencyPropertyDescriptor
.FromProperty(滚动条.MinimumProperty,类型(滚动条))
.AddValueChanged(关联对象,检查最小值);
}
私有void CheckMinMax(对象发送方,事件参数e)
{
AssociatedObject.Visibility=AssociatedObject.Minimum==
关联对象。最大?可见性。隐藏:可见性。可见;
}
}
然后在你的XAML中

<ScrollBar>
 ........
   <i:Interaction.Behaviors>
      <local:MinMaxVisibilityBehavior />
   </i:Interaction.Behaviors>
</ScrollBar>

........

最大值
最小值
相同时,应将
可见性
设置为
折叠
?是。问题是将最大值(或最小值)放入触发器的值测试部分。我认为那是不可能的。如图所示,您不能使用绑定,我也不知道其他方法。我能想到的唯一一件事是自定义可见性转换器,这很容易,但我正在尝试看看我是否可以在模板中不使用代码就完成它。如果
最小值
最大值
相等,则布尔ViewModel属性(
ScrollVisible
?)为false,否则为true(尽管这要求您记住在更改
最小值
最大值
时调用
滚动可见
上的PropertyChanged),或使用多值转换器。修改ViewModel将不起作用,因为我正在创建一个处理自定义滚动的第三方控件,因此它不知道ViewModel。此外,这与布局相关,因此它不会出现在ViewModel中。我知道如何使用多值转换器,但正如我所说的,我想知道它是否可以我完全是在XAML中用触发器完成的。我猜不是。啊…我真的很喜欢人们在投票时没有任何信息或评论来说明原因。这是成为一个好的S.O.公民的方式,伙计(或女孩!)