[英]UWP+Prism MVVM - How do I set the value of a view model property via XAML?
[英]View Model requires information about control in xaml, MVVM way to do this?
從我對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;
}
其中“ connector”是連接點的UserControl,DesignerCanvas是連接器所在的Canvas。
ConnectorViewModel調用此函數以計算貝塞爾曲線的起點和終點,這些起點和終點綁定到ConnectorViewModel的屬性。
當用戶拖動點時,我可以使這項工作正常進行,因為最終被調用的事件將通過這些控件進行訪問,因此我可以在相關點訪問連接器和畫布。
我的問題是,如果要通過編程方式從MainWindow.xaml.cs創建ConnectorViewModel,則需要訪問連接器控件和畫布。 我可以為設計師畫布執行以下操作:
<s:DesignerCanvas Loaded="DesignerCanvas_Loaded"
然后,在DesignerCanvas_Loaded函數中,我可以創建對設計器畫布的靜態引用,因為只有一個靜態引用,它成為單例。 但是,我真的不願意這樣做。
但是對於連接器,它並不像使用數據模板定義的那樣容易:
<DataTemplate DataType="{x:Type local:NodeViewModel}">
<local2:Node/>
</DataTemplate>
所以我不確定如何從“ NodeViewModel”中找到“ Node”。
即使我能弄清楚,我也不認為這正確地遵循了MVVM,因為ViewModel不必知道控件中包含什么。
如果它確實遵守MVVM或執行另一種方法太困難了,那么我必須以這種方式來做,我想尋求有關如何做的幫助?
該代碼改編自以下示例: http : //www.codeproject.com/Articles/484616/MVVM-Diagram-Designer
該帖子缺少一些示例代碼,但是據我所知,我已經在ViewModel中使用GetPointForConnector()
來破壞MVVM,因為您正在引用不同類型的UI元素。 是否從FullyCreatedConnectorInfo
的錨點取自某種數據庫? 我將這些項目放在代碼隱藏(即View.cs)上以正確地跟隨MVVM。 如果它們來自數據庫,則可能應將錨點綁定為具有簡單double
的對象(而非UI元素)來表示坐標,並通過View上的轉換器對其進行處理。 如果它們不是來自某種數據庫,則沒有理由將它們放在ViewModel上,對嗎?
您無需從“ NodeViewModel”中找到“ Node”。 這可能表示您破壞了MVVM。
我認為,通過將這些功能移至視圖並使用轉換器,您可能隨后可以實現所需的功能。
我的意思是使用轉換器 :
例如,如果要在文本框上顯示該點:
XAML:
<Grid.Resources>
<local:MultiConverter x:Key="multiconvert" ></local:MultiConverter>
</Grid.Resources>
<s:DesignerCanvas x:Name="DesignerCanvasName">
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource multiconvert}">
<Binding ElementName="DesignerCanvasName" Path="."/>
<Binding ElementName="ConnectorName" Path="."/>
</MultiBinding>
</TextBox.Text>
</TextBox>
轉換器:
public class MultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DesignerCanvas cavas = values[0] as DesignerCanvas;
Connector source= values[1] as Connector;
Point p = source.TranslatePoint(new Point(0, 0), canvas);
p.X += source.Width / 2.0d;
// and so on
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.