Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 用于选择更改的WPF组合框附加属性未触发_C#_Wpf_Dependency Properties_Attached Properties - Fatal编程技术网

C# 用于选择更改的WPF组合框附加属性未触发

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"

要触发列表框选择更改,我创建了一个附加属性并将其绑定到XAML,如下所示:

<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);
           }
    }
}