gpt4 book ai didi

c# - 附加属性绑定(bind)不起作用

转载 作者:行者123 更新时间:2023-11-30 13:00:53 26 4
gpt4 key购买 nike

我创建了一个附加属性,以在元素样式的 datagridRow 或 datagricell 上使用输入绑定(bind)来设置命令。

我在这里尝试在动态创建的事物(例如数据网格/单元格)上添加 inputBinding,这就是我尝试在样式中添加 inputbinding 的原因。

不幸的是,样式不允许我在 xaml 中使用数据网格行/单元格的 InputBindings 属性,它需要在代码中设置,这就是我需要附加属性的原因。

附加属性 propertychangedcallback 方法在每个行/单元格创建时触发,该方法在设置属性和属性值时接收对象。该值是一个输入绑定(bind)集合。在此集合中,项目存在,但这些项目的属性未绑定(bind)到它们的值

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

当我删除 InputBindingsCollection 并使用单个 InputBinding 时,它可以工作,但我只能在输入绑定(bind)上设置,并且我想要鼠标绑定(bind)和键绑定(bind),所以我需要使用 InputBindingsCollection。

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

InputBindingsPropertyChangedCallBack 方法中,inpuBind.CommandinpuBind.CommandParameter 为 null 而不是绑定(bind)值

附加命令

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

最佳答案

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

所以你必须编写 public static Class AttachedCommand{}

关于c# - 附加属性绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21473314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com