为不同的窗口设置不同的绑定数据上下文

时间:2019-05-20 14:55:02

标签: wpf xaml data-binding binding datacontext

我有一个带有某些控件的窗口,其中某些控件可以打开其他带有不同控件的窗口。第一个窗口中的绑定效果很好,而一个新窗口中的绑定效果也很好。在第三个窗口中,绑定似乎不起作用。

当我构建第二个窗口时,令我惊讶的是,我没有将其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);

这是我正在尝试使其工作的viewmodel类。

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字符串从未出现过,当我在后面的代码中尝试它时也没有出现。

0 个答案:

没有答案