Из того, что я понимаю из MVVM, это неправильная идея, но я хотел бы знать, действительно ли это так, и если да, то как правильно достичь того, что я пытаюсь, или иначе я бы хотел помочь в этом.Для просмотра модели требуется информация о контроле в xaml, MVVM.
У меня есть ConnectorViewModel, который содержит класс FullyCreatedConnectorInfo, который хранит «опорную точку», где должен упасть узел. Для расчета этого я требую следующую функцию:.
public static Point GetPointForConnector(DesignerCanvas canvas, Connector source)
{
Point p = source.TranslatePoint(new Point(0, 0), canvas);
p.X += source.Width/2.0d;
p.Y += source.Height/2.0d;
return p;
}
Где разъем 'является UserControl точки подключения, DesignerCanvas является Canvas, который разъем находится в
Эта функция вызывается ConnectorViewModel к вычислить начальную и конечную точки кривых безье, привязанную к свойству из ConnectorViewModel.
Я могу сделать эту работу прекрасной, когда пользователь перетаскивает точки, поскольку события, которые в конечном итоге получают вызов, проходят через эти элементы управления, поэтому я имею доступ к соединителям и холсту в соответствующих точках.
Моя проблема в том, что если я хочу программно создать ConnectorViewModel, скажем MainWindow.xaml.cs Мне нужен доступ к коннектору и холсту. Я могу сделать что-то подобное для дизайнера холста:
<s:DesignerCanvas Loaded="DesignerCanvas_Loaded"
Тогда в функции DesignerCanvas_Loaded я могу создать статическую ссылку на дизайнер холст, так как есть только один его вид становится синглтоном. Я бы действительно не хотел этого делать.
Однако для соединителя это не так просто, как это определено с помощью шаблонов данных:
<DataTemplate DataType="{x:Type local:NodeViewModel}">
<local2:Node/>
</DataTemplate>
Так что я не знаю, как я могу найти «узел» от «NodeViewModel».
Даже если бы я мог понять это, я не думаю, что это следует за MVVM правильно, так как ViewModel не должен знать, что в нем имеет элемент управления.
Если он соблюдает MVVM или делает это по-другому, это слишком сложно, и я должен сделать это таким образом, я хотел бы помочь в том, как это сделать?
код адаптирован из этого образца: http://www.codeproject.com/Articles/484616/MVVM-Diagram-Designer
Проблема в том, что я не могу вычислить точку привязки линий без доступа к управлению холстом и узлом. – tweetypi
@soshiki Любая причина, по которой вы не можете привязываться к преобразователю/мультиконвертеру? – Tyress
Проблема заключается в том, что пути определяются как стиль в проекте DiagramDesigner, а холст - в MainWindow.xaml. Кроме того, фактические соединители определены в их собственном отдельном пользовательском элементе управления (Node.xaml) – tweetypi