我创建了一个附加属性,使用datagridRow上的inputbinding或元素样式的datagricell来设置命令。
这里我试图在动态创建的东西上添加inputBinding,例如datagridrows / cells,这就是我试图在样式中添加inputbinding的原因。
不幸的是,样式不允许我使用xaml中datagridrows / cells的InputBindings属性,而且需要在代码中设置这就是我需要附加属性的原因。
附加属性propertychangedcallback方法是在每个行/单元格创建时触发,并且方法返回了设置属性的对象和属性的值。该值是输入绑定集合。在此集合中,项目存在但这些项目的属性不与其值绑定
在xaml中你可以看到我为所有行/单元格只创建了一个InputBinding,但是我需要在每一行上复制这个Inputbinding,因为它们需要自己的commandParameter,否则commandParameter对于每一行/单元格都是相同的< / p>
当我删除InputBindingsCollection并使用单个InputBinding时,它可以工作,但我只能设置inputbinding,我想要一个鼠标绑定和一个键绑定,所以我需要使用InputBindingsCollection。
当我使用InputBindingsCollection时,集合的inputBindings没有正确绑定
在InputBindingsPropertyChangedCallBack
方法中,inpuBind.Command
和inpuBind.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;
}
}
答案 0 :(得分:0)
如果我说得对,附加属性或命令类必须是静态的
所以你必须编写公共静态类AttachedCommand {}