作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
我是一名优秀的程序员,十分优秀!