gpt4 book ai didi

c# - ItemsControl 中 DataTemplate 上的事件处理程序

转载 作者:太空狗 更新时间:2023-10-29 23:14:15 26 4
gpt4 key购买 nike

我有一个 ItemsControl这样我就可以显示同一模板的多个实例。我需要能够在事件处理程序上执行代码,以便我可以区分控件。

例如:我有一份杂货 list ,所以我的 DataTemplate包含“购买”Button对于每一种食物。我想将所述按钮绑定(bind)到代码并告诉按下了哪个按钮。

考虑到我使用的是 MVVM 设计模式,我该如何实现这一点

** XAML:**

<ItemsControl ItemsSource="{Binding MyItemList}">
<ItemsControl.ItemsTemplate>
<DataTemplate>
<Button Content="Buy" />
</DataTemplate>
</ItemsControl.ItemsTemplate>
</ItemsControl>

所以,MyItemListList<MyItem>实例。 DataTemplate包含修改值或执行 MyItem 中不存在的代码的控件:

我已经阅读了很多关于命令的出价模板的文章,但我找不到使用项目列表的文章。

最佳答案

您需要将 Button 绑定(bind)到 ItemsControl 的 DataContext 的命令。

在 WPF 中搜索命令:(一个常见的实现):

public class RelayCommand<T> : IRelayCommand
{
private Predicate<T> _canExecute;
private Action<T> _execute;

public RelayCommand(Action<T> execute, Predicate<T> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}

private void Execute(T parameter)
{
_execute(parameter);
}

private bool CanExecute(T parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}

public bool CanExecute(object parameter)
{
return parameter == null ? false : CanExecute((T)parameter);
}

public void Execute(object parameter)
{
_execute((T)parameter);
}

public event EventHandler CanExecuteChanged;

public void RaiseCanExecuteChanged()
{
var temp = Volatile.Read(ref CanExecuteChanged);

if (temp != null)
temp(this, new EventArgs());
}
}

在您的 ViewModel(ItemsControl 的 DataContext,我希望 :))

   private RelayCommand<FoodItem> _addToGroceriesCommand;
public ICommand AddToGroceriesCommand
{
get
{
if (_addToGroceriesCommand == null)
{
_addToGroceriesCommand = new RelayCommand<FoodItem>(OnAddToGroceries);
}
return _addToGroceriesCommand;
}
}

public void OnAddToGroceries(FoodItem newItem)
{

}

XAML:

   <ItemsControl ItemsSource="{Binding MyItemList}">
<ItemsControl.ItemsTemplate>
<DataTemplate>
<Button Content="Buy"
Command="{Binding Path=DataContext.AddToGroceriesCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}" />
</DataTemplate>
</ItemsControl.ItemsTemplate>
</ItemsControl>

关于c# - ItemsControl 中 DataTemplate 上的事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28034485/

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