gpt4 book ai didi

c# - 为什么这个按钮命令绑定(bind)不起作用?

转载 作者:行者123 更新时间:2023-12-02 01:10:56 28 4
gpt4 key购买 nike

我以前这样做过 50 次。我真的不知道为什么这次不起作用。我有一个 WPF 应用程序,我唯一的依赖项是 MahApps.Metro。我在我的按钮上使用它的 MetroWindow 和动态样式。

这是最新的 xaml:

    <ItemsControl Grid.Column="0" Grid.Row="1" ItemsSource="{Binding ServerList}" Margin="5">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="LightGray">
<StackPanel Orientation="Horizontal">
<Button Style="{DynamicResource MetroCircleButtonStyle}" Content="{StaticResource appbar_monitor}" Command="{Binding VM.ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Controls:MetroWindow}}" CommandParameter="{Binding .}"></Button>
<Label Content="{Binding .}" HorizontalAlignment="Center" VerticalAlignment="Center"></Label>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

这是我的 ViewModel 中的 ServerSelectedCommand:

    private ViewModelCommand _ServerSelectedCommand;
public ViewModelCommand ServerSelectedCommand
{
get
{
if (_ServerSelectedCommand == null)
{
_ServerSelectedCommand = new ViewModelCommand(
p => { SelectServer(p); },
p => true
);
}
return _ServerSelectedCommand;
}
set { _ServerSelectedCommand = value; }
}

private void SelectServer(object parameter)
{

}

ViewModelCommand 类类似于 RelayCommand。在这里:

public class ViewModelCommand : Observable, ICommand
{
public bool CanExecuteValue
{
get { return CanExecute(null); }
}
public ViewModelCommand(
Action<object> executeAction,
Predicate<object> canExecute)
{

if (executeAction == null)
throw new ArgumentNullException("executeAction");

_executeAction = executeAction;
_canExecute = canExecute;
}
private readonly Predicate<object> _canExecute;
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged;
public void OnCanExecuteChanged()
{
OnPropertyChanged(() => CanExecuteValue);
if (CanExecuteChanged != null)
CanExecuteChanged(this, EventArgs.Empty);
}
private readonly Action<object> _executeAction;
public void Execute(object parameter)
{
_executeAction(parameter);
}
}

抱歉代码太多。但是我需要添加它们才能找到我看不到的问题。因此,让我们回到第一个 xaml,这是我尝试过的最新版本。以下是我为有问题的 Button 行尝试的代码。

Command="{Binding ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}"

Command="{Binding ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:ViewModel}}}"

这也没有提供任何东西!

Command="{Binding RelativeSource={RelativeSource AncestorType=Controls:MetroWindow}}"

谢谢!

最佳答案

这个绑定(bind)看起来像是在 ItemsControl 上寻找 ServerSelectedCommand:

Command="{Binding ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}"

试试这个:

Command="{Binding DataContext.ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}"

当然假设 ItemsControl 的 DataContext 是您的 ViewModel。

关于c# - 为什么这个按钮命令绑定(bind)不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17420493/

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