如果我在構造以及在XAML {Binding RelativeSource={RelativeSource Self}}
設置窗口的DataContext到this
話,我可以看到的DataContext是指正確的對象實例(即主窗口)通過將代碼隱藏的Loaded事件中的一個斷點。但是,Window的子元素exampleButton的Command綁定爲null。斷言失敗。設置WPF窗口的DataContext到的RelativeSource自
當我刪除XAML DataContext設置(並僅依賴於構造函數設置),則exampleButton的Command將正確使用DataContext。
爲什麼在XAML場景中將exampleButton的命令綁定爲null?
MainWindow.xaml
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Example"
SizeToContent="WidthAndHeight"
x:Name="mainWindow"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Loaded="mainWindow_Loaded">
<Button x:Name="exampleButton" Command="{Binding Path=ExampleCommand}" Content="Click"/>
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public ICommand ExampleCommand { get; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
ExampleCommand = new DelegateCommand(x => { throw new ApplicationException(); });
}
private void mainWindow_Loaded(object sender, RoutedEventArgs e)
{
Debug.Assert(mainWindow == this);
Debug.Assert(mainWindow.DataContext == this);
Debug.Assert(exampleButton.DataContext == this);
Debug.Assert(exampleButton.Command == ExampleCommand); //<-- FAIL
}
}
所以,這是因爲:在XAML場景中,Window.DataContext * _is not_ * null,因此Button.Command * _is_ *綁定到ExampleCommand的空值(因爲ExampleCommand尚未構造),但在代碼後面場景,Window.DataContext * _is_ * null和Button.Command * _is not * _ bound,直到Window.DataContext被分配,然後分配ExampleCommand,然後它的工作原理*沒有實現INotifyPropertyChanged? – Jono
是的,這是正確的。 – mm8
謝謝。如果我是誠實的,這很容易混淆。 – Jono