WPF 中的扩展器控件



我需要将按钮控件从下面替换为扩展器控件。

<Button Grid.Row="14" Grid.ColumnSpan="2" Content="{Binding InspectionLayoutAdvancedButtonContent, Mode=OneWay}" HorizontalAlignment="Stretch" Margin="10,3" MinWidth="120"
Command="{Binding Path=AdvancedCommand}" Visibility="{Binding SelectedEditingLayoutViewModel.AdvancedButtonVisibility}"
CommandParameter="{Binding ElementName=gridAdvances}"/>

我不知道如何将命令添加到扩展器控件,因此当扩展器展开时,我想使用参数gridAdvanced执行高级命令。

如何实现此目标的最佳方法?

谢谢。

使用Expanded事件:

<Expander Expanded="Expander_Expanded" />

然后从代码隐藏中调用命令:

private void Expander_Expanded(object sender, RoutedEventArgs e)
{
ViewModel vm = (ViewModel)DataContext;
if (vm.AdvancedCommand.CanExecute(vm.gridAdvances))
vm.AdvancedCommand.Execute(vm.gridAdvances));
}

ViewModel更改为您的DataContext的任何类型。

添加对System.Windows.Interactivity.dll的引用(Project->Add Reference->Assemblies->Visual Studio 中的扩展(,并向Expander添加交互触发器:

<Expander xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
<i:Interaction.Triggers>
<i:EventTrigger EventName="IsExpanded" >
<i:InvokeCommandAction Command="{Binding AdvancedCommand}" CommandParameter="{Binding ElementName=gridAdvances}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Expander>

我建议将mm8的解决方案与Freggar建议的事件扩展一起使用

<UserControl
xmlns:i="clr-amespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"/>
<Expander>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Expanded" >
<i:InvokeCommandAction Command="{Binding AdvancedCommand}" CommandParameter="{Binding ElementName=gridAdvances}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Expander>
<UserControl>

我遇到了同样的问题,由于某种原因,无法对 TreeView 对象(.net core 3 + wpf(中的附加属性执行简单的事件触发器。

<i:Interaction.Triggers>
<i:EventTrigger EventName="Expander.Expand">
<i:InvokeCommandAction Command="{Binding MyCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>

我必须通过自定义行为类来解决它。请参阅下面的灵感;)

public class TreeViewSelectionBehavior : Behavior<TreeView>
{
public object SelectedItem
{
get { return (object)GetValue(SelectedItemProperty); }
set { SetValue(SelectedItemProperty, value); }
}
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register("SelectedItem", typeof(object), typeof(TreeViewSelectionBehavior), new UIPropertyMetadata(null, OnSelectedItemChanged));
public static readonly DependencyProperty CommandProperty = 
DependencyProperty.Register("Command", typeof(ICommand), typeof(TreeViewSelectionBehavior), null);
private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var item = e.NewValue as TreeViewItem;
if (item != null)
{
item.SetValue(TreeViewItem.IsSelectedProperty, true);
}
}
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
this.AssociatedObject.AddHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(this.Expanded));
}
private void Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem item = e.OriginalSource as TreeViewItem;
if (this.Command.CanExecute(item))
{
this.Command.Execute(item);
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (this.AssociatedObject != null)
{
this.AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
this.AssociatedObject.RemoveHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(this.Expanded));
}
}
private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
this.SelectedItem = e.NewValue;
}
}

那么用法很简单

<i:Interaction.Behaviors>
<local:TreeViewSelectionBehavior SelectedItem="{Binding SelectedItem}" Command="{Binding ExpandHistoricalItemCommand}"/>
</i:Interaction.Behaviors>

最新更新