附加属性无法绑定

问题描述 投票:0回答:1

我们有一个WPF应用程序,该应用程序的查询计数结果显示在屏幕上。我们最初将结果定义为按钮,以便在单击结果时,应用程序将显示查询结果的详细列表。但是,由于与该问题无关的原因,我们现在需要将其作为边框(基本上只是原始按钮的模板)。到目前为止,我已经设置了附加属性:

public static class AttachedCommandBehavior
{
    #region Command

    public static DependencyProperty PreviewMouseLeftButtonUpCommandProperty = DependencyProperty.RegisterAttached(
        "PreviewMouseLeftButtonUpCommand",
        typeof(ICommand),
        typeof(AttachedCommandBehavior),
        new FrameworkPropertyMetadata(PreviewPreviewMouseLeftButtonUpChanged));

    public static void SetPreviewMouseLeftButtonUpChanged(DependencyObject target, ICommand value)
    {
        target.SetValue(PreviewMouseLeftButtonUpCommandProperty, value);
    }

    public static ICommand GetPreviewMouseLeftButtonUpChanged(DependencyObject target)
    {
        return (ICommand)target.GetValue(PreviewMouseLeftButtonUpCommandProperty);
    }

    private static void PreviewPreviewMouseLeftButtonUpChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is UIElement element)
        {
            if (e.NewValue != null && e.OldValue == null)
            {
                element.PreviewMouseLeftButtonUp += element_PreviewMouseLeftButtonUp;
            }
            else if (e.NewValue == null && e.OldValue != null)
            {
                element.PreviewMouseLeftButtonUp -= element_PreviewMouseLeftButtonUp;
            }
        }
    }

    private static void element_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (sender is UIElement element)
        {
            if (element.GetValue(PreviewMouseLeftButtonUpCommandProperty) is ICommand command)
                command.Execute(CommandParameterProperty);
        }
    }

    #endregion

    #region CommandParameter

    public static DependencyProperty CommandParameterProperty = DependencyProperty.RegisterAttached(
        "CommandParameter",
        typeof(object),
        typeof(AttachedCommandBehavior),
        new FrameworkPropertyMetadata(CommandParameterChanged));

    public static void SetCommandParameter(DependencyObject target, object value)
    {
        target.SetValue(CommandParameterProperty, value);
    }

    public static object GetCommandParameter(DependencyObject target)
    {
        return target.GetValue(CommandParameterProperty);
    }

    private static void CommandParameterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is UIElement element)
        {
            element.SetValue(CommandParameterProperty, e.NewValue);
        }
    }

    #endregion
}

然后在我的XAML中,我试图将命令绑定到附加的DependencyProperty:

<Border Background="{Binding BackgroundColor, Converter={StaticResource ColorNameToBrushConverter}}"
        Cursor="{x:Static Cursors.Hand}"
        local:AttachedCommandBehavior.PreviewMouseLeftButtonUpChanged="{Binding QueryClickedCommand}">
   <Grid>...</Grid>
</Border>

但是,我那条弯曲的蓝色小线告诉我:“绑定”不能在“边界”集合中使用。只能在DependencyObject的DependencyProperty上设置“ Binding”。”作为我的大胆程序员,我大胆地忽略了那小小的蓝色,无论如何都要尝试运行。在这一点上,我得到一个例外:

System.Windows.Markup.XamlParseException:不能在“ Viewbox”类型的“ SetPreviewMouseLeftButtonUpChanged”属性上设置“ Binding”。只能在DependencyObject的DependencyProperty上设置'Binding'。'

c# wpf xaml dependency-properties attached-properties
1个回答
0
投票

原来这是一个命名约定问题。在复制/粘贴/重命名/一般的犹豫不决中,我弄乱了命令属性的getter和setter的名称。一旦将它们全部更改为正确的模式,我的代码就会运行。

#region Command

public static DependencyProperty PreviewMouseLeftButtonUpCommandProperty = DependencyProperty.RegisterAttached(
            "PreviewMouseLeftButtonUpCommand",
            typeof(ICommand),
            typeof(AttachedCommandBehavior),
            new FrameworkPropertyMetadata(PreviewMouseLeftButtonUpChanged));

public static void SetPreviewMouseLeftButtonUpCommand(DependencyObject target, ICommand value)
{
    target.SetValue(PreviewMouseLeftButtonUpCommandProperty, value);
}

public static ICommand GetPreviewMouseLeftButtonUpCommand(DependencyObject target)
{
    return (ICommand)target.GetValue(PreviewMouseLeftButtonUpCommandProperty);
}

private static void PreviewMouseLeftButtonUpChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    if (d is UIElement element)
    {
        if (e.NewValue != null && e.OldValue == null)
        {
            element.PreviewMouseLeftButtonUp += element_PreviewMouseLeftButtonUp;
        }
        else if (e.NewValue == null && e.OldValue != null)
        {
            element.PreviewMouseLeftButtonUp -= element_PreviewMouseLeftButtonUp;
        }
    }
}

private static void element_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (sender is UIElement element)
    {
        if (element.GetValue(PreviewMouseLeftButtonUpCommandProperty) is ICommand command)
            command.Execute(CommandParameterProperty);
    }
}

#endregion
© www.soinside.com 2019 - 2024. All rights reserved.