我正在關注如何從代碼隱藏中訪問您的課程的問題。DataContext以它所說的方式實作它對我不起作用(顯然我做錯了什么)。
我正在嘗試做的事情:
我有一個按鈕試圖Text從系結到的類中讀取屬性TextBox:
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));
}
}
}
完整的代碼也在這個問題中(因為它在上面鏈接的問題中被“回答”而被關閉,但該解決方案仍然對我不起作用)。我究竟做錯了什么?
uj5u.com熱心網友回復:
表達方式
<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它為 null,因為 DataContext 不包含 type 的物件myClass。通常,當您使用運算子時,您應該始終在訪問它之前as檢查結果。null或使用is運算子
if (DataContext is myClass dataContext)
{
MessageBox.Show(dataContext.Text);
}
您可能還注意到使用該myWindow欄位是多余的,因為方法背后的代碼屬于 MainWindow 類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496862.html
上一篇:從不同的視窗更改主視窗的可見性
