У меня есть окно с некоторыми элементами управления, где некоторые элементы управления открывают другие окна с другими элементами управления. Привязки в первом окне прекрасно работают, и что странно, привязки в одном из новых окон также работают хорошо. Есть третье окно, где привязки не работают.
Когда я построил второе окно, к моему удивлению, я не установил явно контекст данных своих привязок 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;
}
}
Но строка имени объекта никогда не появляется, она также не появляется, когда я пробую ее в коде позади.