установка другого контекста данных привязки для разных окон - PullRequest
0 голосов
/ 20 мая 2019

У меня есть окно с некоторыми элементами управления, где некоторые элементы управления открывают другие окна с другими элементами управления. Привязки в первом окне прекрасно работают, и что странно, привязки в одном из новых окон также работают хорошо. Есть третье окно, где привязки не работают.

Когда я построил второе окно, к моему удивлению, я не установил явно контекст данных своих привязок xaml как частичный класс xaml.cs, в котором существуют все связанные свойства. Но у второго окна есть привязки, и они прекрасно работают.

Это очень странно для меня, поскольку я явно не знаю, как работает контекст данных и привязки. Для третьего окна я не могу даже отобразить привязки даже для простого свойства строки.

Может ли кто-нибудь указать мне на подробное обсуждение того, как работает привязка данных? Я думаю, что это довольно просто, что я хочу сделать, установить datacontext для каждого окна xaml, чтобы быть частичным классом 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;
    }
}

Но строка имени объекта никогда не появляется, она также не появляется, когда я пробую ее в коде позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...