C# 用于选择更改的WPF组合框附加属性未触发
要触发列表框选择更改,我创建了一个附加属性并将其绑定到XAML,如下所示:C# 用于选择更改的WPF组合框附加属性未触发,c#,wpf,dependency-properties,attached-properties,C#,Wpf,Dependency Properties,Attached Properties,要触发列表框选择更改,我创建了一个附加属性并将其绑定到XAML,如下所示: <Controls:MetroWindow x:Class="Transport.MainWindow" xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:extension="clr-namespace:Transport.Extensions"
<Controls:MetroWindow x:Class="Transport.MainWindow"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:extension="clr-namespace:Transport.Extensions"
xmlns:local="clr-namespace:Transport
mc:Ignorable="d"
Title="CIP Simulator" Height="550" Width="1500"
BorderThickness="0"
GlowBrush="Black"
ResizeMode="CanResizeWithGrip"
ShowMaxRestoreButton="False"
WindowTransitionsEnabled="False"
WindowStartupLocation="CenterScreen">
<ComboBox Grid.Column="1" Grid.Row="2" ItemsSource="{Binding Sets}" DisplayMemberPath="Set"
extension:CommandProviders.Command="{Binding SetSelectionChange}"
SelectedItem="{Binding SelectedSet}" Grid.ColumnSpan="3"/>
我现在已经创建了公共I命令并分配给relayCommand(这是其他按钮的工作中继命令)
但这并不是启动选择更改 如注释中所述,您应该定义
属性ChangedCallback
。下面是订阅combBox
选择已更改并发出命令的管道代码,该命令应触发绑定RelayCommand
public class CommandProviders
{
public static ICommand GetCommand(DependencyObject depObject)
{
return (ICommand)depObject.GetValue(CommandProprtey);
}
public static void SetCommand(DependencyObject depobject, ICommand value)
{
depobject.SetValue(CommandProprtey, value);
}
public static readonly DependencyProperty CommandProprtey =
DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(CommandProviders), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));
}
private static void OnCommandChanged
(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ComboBox cmbBox= (ComboBox)d;
if (cmbBox != null)
{
cmbBox.SelectionChanged += (sender, eventArgs) =>
{
d.GetValue(CommandProprtey)?.Invoke(null);
}
}
}
其他几点
为示例透视图编写了此代码。在代码中,SelectionChanged事件已订阅,因此您必须查看如何取消订阅该事件,以免导致内存泄漏 到目前为止,您已经在source和target中完成了
SetSelectionChange
的羽化,但是谁会调用附加的命令呢?只有在调用附加命令后,才会调用'ICommand SetSelectionChange'执行方法。但是我看不到任何调用attach命令的代码。@user1672994,你是什么意思,attached属性接受从XAML分配给它的命令,并从ViewModel分配ICommand。这就像绑定到按钮的任何其他命令一样。在选择“更改”时,应激发Icommand,因为附着属性的类型为ICommand@Simsons,您试图通过使用该命令(SetSelectionChange)实现的目标是什么?请参见示例实现-。因此,在您的情况下,您应该订阅ComboBox的SelectionChanged事件,并且在处理程序中,您应该以command?的形式调用该命令。如果要在不带参数的情况下发送,则调用(null)
,如果要使用选定的项值发送,则调用()。如上所述,您忘了实现PropertyChangedCallback,它在设置附加属性的ComboBox处附加SelectionChanged事件处理程序。有道理,没有从附加属性回调。您是指安全强制转换而不是直接强制转换到ComboBox吗?此外,property中的输入错误可能会导致问题。
public ICommand SetSelectionChange { get; set; }
SetSelectionChange = new RelayCommand(commandx =>
{
//Do Something
});
public class CommandProviders
{
public static ICommand GetCommand(DependencyObject depObject)
{
return (ICommand)depObject.GetValue(CommandProprtey);
}
public static void SetCommand(DependencyObject depobject, ICommand value)
{
depobject.SetValue(CommandProprtey, value);
}
public static readonly DependencyProperty CommandProprtey =
DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(CommandProviders), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));
}
private static void OnCommandChanged
(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ComboBox cmbBox= (ComboBox)d;
if (cmbBox != null)
{
cmbBox.SelectionChanged += (sender, eventArgs) =>
{
d.GetValue(CommandProprtey)?.Invoke(null);
}
}
}