我可以使用DataTrigger基于底层数据对象的属性在我的ListBoxItem模板上触发属性设置
<DataTrigger Binding="{Binding Path=IsMouseOver}" Value="true">
<Setter TargetName="ItemText" Property="TextBlock.TextDecorations" Value="Underline">
</Setter>
</DataTrigger>
但如果我想做相反的事情呢?我的意思是基于我的ListBoxItem的属性值在基础数据对象上设置属性值。类似的东西:
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="MyClass.IsHilited" Value="True"></Setter>
</Trigger>
是否存在类似这样的机制或处理此类情况的推荐方法?
感谢。
答案 0 :(得分:2)
我认为您可以使用EventSetter在XAML中执行Josh G在代码中建议的内容。也许为MouseEnter
和MouseLeave
事件创建一个,并为每个事件设置适当的样式?
更新:您可以设置如下事件:
<ListBox>
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="MouseEnter" Handler="OnListBoxItemMouseEnter" />
<EventSetter Event="MouseLeave" Handler="OnListBoxItemMouseLeave" />
</Style>
</ListBox.Resources>
<ListBoxItem>Item 1</ListBoxItem>
<ListBoxItem>Item 2</ListBoxItem>
<ListBoxItem>Item 3</ListBoxItem>
<ListBoxItem>Item 4</ListBoxItem>
<ListBoxItem>Item 5</ListBoxItem>
</ListBox>
样式注册MouseEnter
MouseLeave
的{{1}}和ListBoxItems
个事件
然后在你的代码后面的文件:
ListBox.
当鼠标悬停在项目上方时,这些处理程序将private void OnListBoxItemMouseEnter(object sender, RoutedEventArgs e)
{
ListBoxItem lvi = sender as ListBoxItem;
if(null != lvi)
{
lvi.Foreground = new SolidColorBrush(Colors.Red);
}
}
private void OnListBoxItemMouseLeave(object sender, RoutedEventArgs e)
{
ListBoxItem lvi = sender as ListBoxItem;
if(null != lvi)
{
lvi.Foreground = new SolidColorBrush(Colors.Black);
}
}
的文本颜色设置为红色,当鼠标离开时将这些颜色设置为黑色。
答案 1 :(得分:1)
WPF触发器用于引起视觉更改。触发器中的Setter对象会导致控件上的属性更改。
如果要响应某个事件(如EventTrigger),您可以随时在代码中订阅该事件,然后在处理程序中设置data属性。
您可以这种方式使用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处理程序中的data属性同步。然后,您可以使用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>