尝试从代码后端访问DataContext类



我遵循如何从代码后访问您的DataContext类的问题。按照它所说的方式实现它对我不起作用(显然我做错了什么)。

我想做什么:

我有一个按钮,正试图从绑定到TextBox的类读取Text属性:

private void myButton_Click(object sender, RoutedEventArgs e)
{

var dataContext = myWindow.DataContext as myClass;
System.Windows.MessageBox.Show(dataContext.Text);
}

由于某些原因,dataContext总是为空。

XAML:

<Window x:Class="TestApp.MainWindow"
x:Name="myWindow"
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:TestApp"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="300">
<Window.Resources>
<local:myClass x:Key="myDataSource"/>
</Window.Resources>
<Window.DataContext>
<Binding Source="myDataSource"/>
</Window.DataContext>
<Grid Margin="0,0,0,2">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox HorizontalAlignment="Stretch" Margin="5,5,5,5" TextWrapping="Wrap" Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" />
<Button x:Name="myButton" Content="Button" HorizontalAlignment="Stretch" Margin="5,5,5,5" Grid.Row="1" VerticalAlignment="Stretch" Click="myButton_Click"/>
</Grid>
</Window>

后台代码:

namespace TestApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//var dataContext = myWindow.DataContext as myClass;
}
private void myButton_Click(object sender, RoutedEventArgs e)
{
var dataContext = myWindow.DataContext as myClass;
System.Windows.MessageBox.Show(dataContext.Text);
}
}
public class myClass : INotifyPropertyChanged
{
private string text;
public string Text
{
get { return text; }
set { 
text = value;
OnPropertyChanged("Text");
}
}
public event PropertyChangedEventHandler? PropertyChanged;
// Create the OnPropertyChanged method to raise the event
// The calling member's name will be used as the parameter.
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}

完整的代码也在这个问题中(因为它是"answer "在上面链接的问题中,但解决方案仍然不适合我)。我做错了什么?

表达式

<Window.DataContext>
<Binding Source="myDataSource"/>
</Window.DataContext>

将DataContext绑定到字符串"myDataSource"。它应该是

<Window.DataContext>
<Binding Source="{StaticResource myDataSource}"/>
</Window.DataContext>
但是,您根本不需要将DataContext对象声明为资源。只写
<Window.DataContext>
<local:myClass/>
</Window.DataContext>

还要注意您的结论"DataContext总是为空"。是不正确的。它是表达式DataContext as myClass为空的结果,因为DataContext不包含类型为myClass的对象。通常,当您使用as操作符时,应该在访问null之前检查它的结果。或者使用is操作符,如

if (DataContext is myClass dataContext)
{
MessageBox.Show(dataContext.Text);
}

您可能还注意到使用myWindow字段是多余的,因为方法背后的代码属于MainWindow类。

最新更新