WPF 触发器旨在引起视觉变化。触发器中的 Setter 对象会导致控件上的属性更改。
如果您想响应一个事件(如 EventTrigger),您总是可以简单地在代码中订阅该事件,然后在处理程序中设置数据属性。
您可以通过这种方式使用 MouseEnter 和 MouseLeave。例如:
listBox.MouseEnter += listBox_MouseEnter;
listBox.MouseLeave += listBox_MouseLeave;
void listBox_MouseEnter(object sender, MouseEventArgs e)
{
listBox.MyClass.IsHilited = true;
}
void listBox_MouseLeave(object sender, MouseEventArgs e)
{
listBox.MyClass.IsHilited = false;
}
您可以将数据对象的属性绑定到控件上的某些属性,如下所示:
Binding myBind = new Binding("IsHilited");
myBind.Source = listBox.DataContext;
listBox.SetBinding(listBox.IsEnabled, myBind);
但是,您不能在绑定中使用 IsMouseOver。
如果您创建自定义控件,您可以更灵活地将这样的绑定构建到控件中。您可以创建自定义依赖属性并将其与 DependencyPropertyChanged 处理程序中的数据属性同步。然后,您可以使用 WPF 触发器设置此依赖项属性。
这是一个例子:
public static readonly DependencyProperty IsHilitedProperty =
DependencyProperty.Register("IsHilited", typeof(bool), typeof(CustomListBox),
new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsHilitedChanged)));
public double IsHilited
{
get
{
return (bool)GetValue(IsHilitedProperty);
}
set
{
SetValue(IsHilitedProperty, value);
}
}
private static void OnIsHilitedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
CustomListBox box = obj as CustomListBox;
if (box != null)
box.MyClass.IsHilited = box.IsHilited;
// Or:
// Class myClass = box.DataContext as Class;
// myClass.IsHilited = box.isHilited;
}
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="IsHilited" Value="True"/>
</Trigger>