gpt4 book ai didi

c# - 为什么列表框模板中的绑定(bind)命令无法运行?

转载 作者:行者123 更新时间:2023-12-03 10:57:38 25 4
gpt4 key购买 nike

为什么列表框中的按钮无法运行绑定(bind)命令?
我将此命令绑定(bind)为简单的按钮(不是模板),它运行良好。
主文件

<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication2"
mc:Ignorable="d"
Title="MainWindow" Height="800" Width="525">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="lbTemp">
<StackPanel>
<TextBlock Height="50" Text="{Binding}"/>
<Button Height="20" Content="click" Command="{Binding Path=TestCommand}" CommandParameter="hello"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox x:Name="listBox" Width="500" Height="300" ItemTemplate="{StaticResource lbTemp}" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=DataContext.MyData}"/>
<Button Command="{Binding Path=TestCommand}" CommandParameter="hello" Width="200" Height="40"/>
</Grid>

View 模型.cs
public class ViewModel : INotifyPropertyChanged
{
public ViewModel() { }

public ObservableCollection<string> MyData {
get
{
return _MyData;
}
set
{
if (!_MyData.SequenceEqual(value))
{
_MyData = value;
}
OnPropertyChanged();
}
}
private ObservableCollection<string> _MyData = new ObservableCollection<string>();

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string caller="")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller));
}

private ICommand _testCommand;
public ICommand TestCommand
{
get
{
return _testCommand;
}
set
{
if (_testCommand != value)
{
_testCommand = value;
OnPropertyChanged();
}
}
}
}

和 Command.cs
public class RelayCommand : ICommand
{
public RelayCommand(Action action, Func<object, bool> canExecutePredicate)
{
if (action == null || canExecutePredicate == null)
throw new ArgumentNullException("Can't be null");
this._action = action;
this._canExecutePredicate = canExecutePredicate;
}

public RelayCommand(Action action) : this(action, (obj) => true) { }

Action _action;
Func<object, bool> _canExecutePredicate;

public event EventHandler CanExecuteChanged;
protected virtual void OnCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}

public bool CanExecute(object parameter)
{
return _canExecutePredicate(parameter);
}

public void Execute(object parameter)
{
_action?.Invoke();
}
}

你能说出这个解决方案的有效 xaml 示例吗?

最佳答案

DataContext两个Button s 不同。我们来看看DataContext对于您认为的某些元素。

  • WindowDataContext是你的ViewModel类(class)。
  • ListBoxDataContextWindow 相同的。应该不需要使用RelativeSourceItemsSource您已设置的绑定(bind)。
  • ButtonDataTemplate也有相同的DataContext作为 Window .这就是为什么 Command绑定(bind)工作正常。
  • Button里面DataTemplate有一个 DataContext它代表的特定项目来自MyData您在 ViewModel 中创建的收藏类(class)。重要的是,它不是 ViewModel类本身。

  • 这是我将使用 RelativeSource 的地方.
    <Button Height="20" Content="click" Command="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}" CommandParameter="hello"/>

    如果这对您不起作用,请告诉我。

    关于c# - 为什么列表框模板中的绑定(bind)命令无法运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39819702/

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