在此示例中,在 XAML 中使用 DataContext 和代码背后有啥区别?

Posted

技术标签:

【中文标题】在此示例中,在 XAML 中使用 DataContext 和代码背后有啥区别?【英文标题】:What's the difference in this example between using DataContext in XAML & code behind?在此示例中,在 XAML 中使用 DataContext 和代码背后有什么区别? 【发布时间】:2021-11-11 04:24:30 【问题描述】:

我正在使用 DataContext 学习 WPF 中的绑定方式,但我不明白为什么它会这样运行。 下面是代码。

Ex1:可以得到正确的绑定数据(在后面的代码中赋值DataContext)

Xaml

<Window x:Class="DemoDataContextAndItemSource.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DemoDataContextAndItemSource"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <StackPanel Margin="15">
        <WrapPanel>
            <TextBlock Text="Window title:  " />
            <TextBox Text="Binding Title, UpdateSourceTrigger=PropertyChanged" Width="150" />
        </WrapPanel>
        <WrapPanel Margin="0,10,0,0">
            <TextBlock Text="Window dimensions: " />
            <TextBox Text="Binding Width" Width="50" />
            <TextBlock Text=" x " />
            <TextBox Text="Binding Height" Width="50" />
        </WrapPanel>
    </StackPanel>
</Window>

cs

    public partial class MainWindow : Window
    
        public MainWindow()
        
            InitializeComponent();
            DataContext = this;
        
    

Compile Success

Ex2:为什么 Width 和 Height 数字是 NaN & Compile failed ?? (在 Xaml 中使用 DataContext)

<Window x:Class="DemoDataContextAndItemSource.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DemoDataContextAndItemSource"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindow/>
    </Window.DataContext>
    <StackPanel Margin="15">
        <WrapPanel>
            <TextBlock Text="Window title:  " />
            <TextBox Text="Binding Title, UpdateSourceTrigger=PropertyChanged" Width="150" />
        </WrapPanel>
        <WrapPanel Margin="0,10,0,0">
            <TextBlock Text="Window dimensions: " />
            <TextBox Text="Binding Width" Width="50" />
            <TextBlock Text=" x " />
            <TextBox Text="Binding Height" Width="50" />
        </WrapPanel>
    </StackPanel>
</Window>

Compile Failed

【问题讨论】:

【参考方案1】:

表达式

<Window.DataContext>
    <local:MainWindow/>
</Window.DataContext>

将创建一个新的 MainWindow 实例并将其分配给 DataContext 属性。

为了分配当前实例,您必须编写

<Window ... DataContext="Binding RelativeSource=RelativeSource Self">

【讨论】:

以上是关于在此示例中,在 XAML 中使用 DataContext 和代码背后有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

WPF中XAML中使用String.Format格式化字符串示例

如何在 WPF XAML 中使用嵌套类?

WPF XAML 绑定中的自动字段更新 - 简单示例不起作用

XAML:相同的模板,不同的绑定

如何在 C# XAML WinRT 中使用字符串变量设置控件的属性?

将 XAML 中的可见性绑定到可见性属性