首页 > 解决方案 > 为不同的窗口设置不同的绑定数据上下文

问题描述

我有一个带有一些控件的窗口,其中一些控件打开了具有不同控件的其他窗口。第一个窗口中的绑定运行良好,奇怪的是其中一个新窗口中的绑定也运行良好。还有第三个窗口,绑定似乎不起作用。

当我构建第二个窗口时,令我惊讶的是,我没有将其 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 字符串从未出现过,当我在代码隐藏中尝试它时也没有出现。

标签: wpfxamldata-bindingbindingdatacontext

解决方案


推荐阅读