附属物绑定不起作用

时间:2014-01-31 05:47:28

标签: c# .net wpf xaml attached-properties

我创建了一个附加属性,使用datagridRow上的inputbinding或元素样式的datagricell来设置命令。

这里我试图在动态创建的东西上添加inputBinding,例如datagridrows / cells,这就是我试图在样式中添加inputbinding的原因。

不幸的是,样式不允许我使用xaml中datagridrows / cells的InputBindings属性,而且需要在代码中设置这就是我需要附加属性的原因。

附加属性propertychangedcallback方法是在每个行/单元格创建时触发,并且方法返回了设置属性的对象和属性的值。该值是输入绑定集合。在此集合中,项目存在但这些项目的属性不与其值绑定

在xaml中你可以看到我为所有行/单元格只创建了一个InputBinding,但是我需要在每一行上复制这个Inputbinding,因为它们需要自己的commandParameter,否则commandParameter对于每一行/单元格都是相同的< / p>

当我删除I​​nputBindingsCollection并使用单个InputBinding时,它可以工作,但我只能设置inputbinding,我想要一个鼠标绑定和一个键绑定,所以我需要使用InputBindingsCollection。

当我使用InputBindingsCollection时,集合的inputBindings没有正确绑定

InputBindingsPropertyChangedCallBack方法中,inpuBind.CommandinpuBind.CommandParameter为空而不是绑定值

AttacheCommand

public class AttacheCommand
{
    public static DependencyProperty InputBindingsProperty = DependencyProperty.RegisterAttached("InputBindings", 
                                                                                                 typeof(InputBindingCollection),
                                                                                                 typeof(AttacheCommand),
                                                                                                 new PropertyMetadata(InputBindingsPropertyChangedCallBack));
    public static void SetInputBindings(UIElement element, InputBindingCollection value)
    {
        element.SetValue(InputBindingsProperty, value);
    }

    public static InputBindingCollection GetInputBindings(UIElement element)
    {
        return (InputBindingCollection)element.GetValue(InputBindingsProperty);
    }

    public static void InputBindingsPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UIElement element = d as UIElement;
        InputBinding copy;
        foreach (InputBinding inpuBind in e.NewValue as InputBindingCollection)
        {
           //*****Here is my problem inpuBind.Command and inpuBind.CommandParameter are not bind to their value and are null
            copy = new InputBinding(inpuBind.Command, inpuBind.Gesture);
            copy.CommandParameter = inpuBind.CommandParameter;

            element.InputBindings.Add(copy);
        }
    }
}

查看:

<Window x:Class="UltimateCommand.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:UltimateCommand"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <local:ViewModel x:Name="vm"/>
</Window.DataContext>
<Grid>
    <DataGrid ItemsSource="{Binding listModel1}" IsReadOnly="True">
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Setter Property="local:AttacheCommand.InputBindings" >
                    <Setter.Value>
                        <InputBindingCollection>
                            <MouseBinding Command="{Binding ElementName=vm, Path=cmd1}" CommandParameter="{Binding}" Gesture="LeftClick"/>
                        </InputBindingCollection>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>
</Grid>
</Window>


ViewModel :(和命令)

class ViewModel
{
    public Model1[] listModel1
    {
        get
        {
            return new Model1[] { new Model1("nom1", 1), new Model1("nom2", 2) };
        }
    }

    public Command1 cmd1
    {
        get
        {
            return new Command1();
        }
    }
}

public class Command1 : ICommand
{
    public bool CanExecute(object parameter)
    {
        //throw new NotImplementedException();
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        //throw new NotImplementedException();
    }
}


模型1:

public class Model1
{
    public string Nom { get; set; }
    public int Age { get; set; }

    public Model1(string n, int a)
    {
        Nom = n;
        Age = a;
    }
}

1 个答案:

答案 0 :(得分:0)

如果我说得对,附加属性或命令类必须是静态的

所以你必须编写公共静态类AttachedCommand {}