gpt4 book ai didi

c# - 如何将命令绑定(bind)到按钮

转载 作者:行者123 更新时间:2023-11-30 20:48:36 24 4
gpt4 key购买 nike

我是 wpf 和这个花哨的绑定(bind)东西的新手,遵循这些 tutorial并得到这个 XAML:

<Button
x:Name="btn"
Content="refresh"
Command="{Binding RefreshCmd}" />

和这段代码:

public someClass ()
{
InitializeComponent();

CreateRefreshCmd();
btn.DataContext=this; // without this line it will not work !!
}

public ICommand RefreshCmd
{
get;
internal set;
}

private bool CanExecuteRefreshCmd ()
{
return true;
}

private void CreateRefreshCmd ()
{
RefreshCmd=new RelayCommand(e => RefreshExec(), c => this.CanExecuteRefreshCmd());
}

public void RefreshExec ()
{
// do something fancy here !
}

但是如果没有构造函数中的最后一行,它将无法工作。

教程中没有这一行。

我怎样才能避免这种情况?

编辑:

我用 visual studio 单击了数据绑定(bind)并得到了这个:

Command="{Binding RefreshCmd, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:spielerei}}}"

这真的有必要吗?

最佳答案

要使绑定(bind)生效,您需要为绑定(bind)到目标设置数据上下文,所以是的,这是必要的。在您在编辑中发布的 Command 绑定(bind)中,指示绑定(bind)在类型为 Button 控件的祖先上查找 RefreshCmd 属性my:spielerei,我假设它是包含窗口类型。这就是为什么 DataContext 的显式设置没有出现在教程中的原因。

绑定(bind)和命令可以在代码隐藏中使用,但更常用于 MVVM 模式中的 View 模型。这涉及将类的 DataContext 设置为 View 模型,其中包含要绑定(bind)到的属性和命令。要更改您的代码以遵循 MVVM,我们需要一个 View 模型:

public class SomeClassViewModel
{
public SomeClassViewModel()
{
this.RefreshCmd = new RelayCommand(e => RefreshExec(), c => this.CanExecuteRefreshCmd());
}

public ICommand RefreshCmd { get; internal set; }

private bool CanExecuteRefreshCmd()
{
return true;
}

public void RefreshExec()
{
// do something fancy here !
}
}

然后,在代码隐藏中,创建 View 模型,并将其分配为对象的数据上下文:

public class SomeClass
{
public SomeClass()
{
InitializeComponent();

this.DataContext = new SomeClassViewModel();
}
}

请注意,SomeClass 代码隐藏文件中的所有代码都已移至 View 模型 - 它现在是可测试的,并且您的 XAML 控件可以通过绑定(bind)到 View 模型进行通信属性和执行命令。

关于c# - 如何将命令绑定(bind)到按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24432997/

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