[英]How to bind a command to a button
我對wpf和這種奇特的綁定東西是陌生的,遵循這些教程並獲得了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單擊了數據綁定,並得到了以下信息:
Command="{Binding RefreshCmd, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:spielerei}}}"
這真的有必要嗎?
為了使綁定正常工作,您需要為綁定到目標的對象設置一個數據上下文,因此,這是必要的。 在編輯中發布的Command
綁定中,該綁定被指示在my:spielerei
類型的Button
控件的祖先上查找RefreshCmd
屬性,我假設它是包含窗口的類型。 這就是為什么本教程中沒有出現DataContext
的顯式設置的原因。
綁定和命令可以在后台代碼中使用,但更常見於MVVM模式中的視圖模型。 這涉及將類的DataContext
設置為視圖模型,該模型包含要綁定到的屬性和命令。 要更改您的代碼以遵循MVVM,我們需要一個視圖模型:
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 !
}
}
然后,在后面的代碼中,創建視圖模型,並將其分配為對象的數據上下文:
public class SomeClass
{
public SomeClass()
{
InitializeComponent();
this.DataContext = new SomeClassViewModel();
}
}
請注意, SomeClass
代碼隱藏文件中的所有代碼已移至視圖模型-現在可以對其進行測試,並且您的XAML控件可以通過綁定到屬性和執行命令來與視圖模型進行通信。
如果存在可以綁定的對象,則綁定將正常工作。 從DataContext屬性讀取此對象。 如果未設置此屬性,則沒有任何綁定。 這就是為什么需要以下行:
btn.DataContext=this;
您提到的教程以一些不同的方式進行操作,即它在XAML中設置了DataContext 。 請檢查本教程中的MainWindow.xaml文件。 它在開始時包含以下代碼,用於填充DataContext屬性:
<Window x:Class="MvvmCommand.MainWindow" DataContext="{Binding Main, Source={StaticResource Locator}}">
在WPF中使用綁定時,默認情況下,它將綁定設置為具有綁定屬性的對象的DataContext上的命名屬性。 因此,在您的示例中,按鈕的DataContext。 該屬性是通過樹向下繼承的,因此,如果未在Button上進行設置,它將一直查找樹,一直到擁有控件的窗口。
如果沒有所有XAML可以瀏覽,我不得不猜測,但是我想您還沒有設置承載按鈕的窗口的數據上下文。 通過在構造函數中對此進行顯式設置,就可以設置具有該屬性的對象的綁定源,從而說明它為什么起作用。
通常的方法是將數據上下文設置為包含命令的類。 MVVM是通常的設計模式。 綁定的思想是要分開-它不像事件在后面的代碼中處理它們那樣,而是允許您創建一個視圖模型或類似的類來暴露命令並將其綁定到視圖。 這允許您執行諸如通過視圖模型對功能進行單元測試之類的事情,而不必對視圖進行單元測試,將視圖模型共享到多個視圖等。
需要設置數據上下文,以便綁定框架可以解析值
您可能有多種設置相同方法的方法
您使用的第一種方法
另一種方法是通過xaml進行設置
<Window x:Class="Project.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
這里的想法是將數據上下文設置為self。
簡而言之,沒有必要。 不要將datacontext設置為button,不要在XAML中為頁面(視圖)設置數據上下文(viemodel)。 當然,您的命令必須通過該視圖模型公開。
對於另一個問題,我提出了一個簡單的示例來顯示命令綁定和跨視圖模型通信,請在此處查看https://github.com/mikkoviitala/cross-viewmodel-communication
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.