wpf - 为不同的窗口设置不同的绑定数据上下文
问题描述
我有一个带有一些控件的窗口,其中一些控件打开了具有不同控件的其他窗口。第一个窗口中的绑定运行良好,奇怪的是其中一个新窗口中的绑定也运行良好。还有第三个窗口,绑定似乎不起作用。
当我构建第二个窗口时,令我惊讶的是,我没有将其 xaml 绑定的数据上下文明确设置为所有绑定到属性都存在的 xaml.cs 部分类。但是第二个窗口有绑定,并且工作得很好。
这对我来说很奇怪,因为我显然不知道数据上下文和绑定是如何工作的。对于第三个窗口,即使是简单的字符串属性,我什至无法显示绑定。
有人可以指出我对数据绑定如何工作的彻底讨论吗?我认为我想做的事情相当简单,将每个窗口的 xaml 的 datacontext 设置为与之关联的 xaml.cs 部分类。对于第二个窗口,这似乎是自动发生的,但第三个窗口似乎甚至不适用于简单的字符串属性。
这是来自第二个窗口的绑定。
<TextBlock Name = "ObjectLatLon" Text= "{Binding hoveredObjectLatLon}" Background='White' Width="150" Height="20" Canvas.Top="5" Canvas.Left="685"/>
<TextBlock Name = "CursorLatLon" Text= "{Binding cursorLatLon, UpdateSourceTrigger=PropertyChanged}" Background='White' Width="150" Height="20" Canvas.Top="5" Canvas.Left="840"/>
<TextBlock Name = "TimeTextbox" Text= "{Binding winTime}" Background='White' Width="150" Height="20" Canvas.Top="5" Canvas.Left="1005"/>
这是属性背后的代码。
public string hoveredObjectLatLon
{
get { return HoveredObjectLatLon; }
set { HoveredObjectLatLon = value; ObjectLatLon.Text = hoveredObjectLatLon; }
}
public void cursorLatLon(object sender, MouseEventArgs e)
{
Point p = Mouse.GetPosition(FlatStanley);
double[] d = CanvasCoords_to_LatLon(new double[2] { p.Y, p.X });
p = new Point(d[0], d[1]);
CursorLatLon.Text = "Lat: " + Math.Round(p.X, 2).ToString() + " Lon: " + Math.Round(p.Y, 2).ToString();
}
private void hovered2dorbiter(object sender, MouseEventArgs e)
{
Shape o = sender as Shape;
double[] d = CanvasCoords_to_LatLon(new double[] { Canvas.GetTop(o) + (o.Height/2), Canvas.GetLeft(o) + (o.Width/2) });
hoveredObjectLatLon = "Lat: " + Math.Round(d[0],2) + " Lon: " + Math.Round(d[1], 2);
}
我想知道这些绑定是如何工作的,但是第三个窗口没有绑定到简单的字符串属性,即使我明确声明了“datacontext = this”之类的内容,它也不会工作。我查看了第二个窗口的代码,但我没有在哪里处理数据上下文,但是当然,如果我没有为第一个窗口明确地说“datacontext = this”,那么它的所有绑定都有无法正常工作的风险。
基本上,绑定对我来说非常模糊,不一定是绑定应该如何工作的机制,而是不同数据上下文的管理。
目前我在想的是我唯一的选择是为每一个数据创建一个类那里。根据我的阅读,您的解决方案中只能有一个数据上下文。是这样吗?或者是否有一个足够简单的功能,我可以使用它来简单地将 MyWPFWindow.xaml 窗口的数据上下文作为其 MyWOFWindow.xaml.cs 部分类对应项。
我真的无法让数据上下文与第三个窗口一起工作。
这是我的 XAML:
Window x:Class="COSTUMOBJECTSOLUTION.CUSTOMOBJECT_Window"
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:CUSTOMOBJECTSOLUTION"
mc:Ignorable="d"
Title="CUSTOMOBJECT_Window" Height="300" Width="300">
<TextBlock Grid.Row ="0" Grid.Column="0" Name="COtextblock" Text="{Binding CO_Name}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
在后面的代码中,我在构造函数中说了以下内容:
DataContext = new CUSTOMOBJECT_ViewModel(customobject, mw);
这是我试图让它工作的视图模型类。
internal class CUSTOMOBJECT_ViewModel
{
CUSTOMOBJECT customobject;
MainWindow mW;
string CO_Name { get; set; }
public CUSTOMOBJECT_ViewModel(CUSTOMOBJECT custobj, MainWindow mw)
{
customobject = custobj;
mW = mw;
CO_Name = CUSTOMOBJECT.ObjectName;
}
}
但是 objectname 字符串从未出现过,当我在代码隐藏中尝试它时也没有出现。
解决方案
推荐阅读
- git - “git diff”、“git diff HEAD”和“git diff --staged”的奇怪输出?
- typescript - MSB4062:无法从程序集中加载“Typescript.Tasks.CheckFileSysytemCaseSensitive”任务
- php - WooCommerce REST API v3 远程订购和支付并将所有数据发送到 WP
- typescript - Typescript - 使用 Record 创建字典
- oracle - 使用云钱包将 Oracle 数据库连接到 TOAD for Oracle
- python - 将日期写入 CSVFile python 的顶部
- linux - Docker容器中的Android Studio模拟器问题
- google-photos - 从谷歌照片 api 下载的视频质量不是最好的
- javascript - Flutter 对 Cloud 函数的调用正在解决 DEADLINE_EXCEEDED 云函数异常
- sql-server - 结合聚集列存储索引和非聚集列存储索引的好处?