簡體   English   中英

View Model是否需要有關xaml中的控件信息,MVVM的方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM