2011-03-23 19 views
0

沒有代碼綁定到父位置的變化在WPF我有一個類似Visio interfact但有背後的一些元素的實際模型數據。元素可以由用戶移動。如何使用XAML和背後

我使用ContentControl中在畫布上,由此元件的的ViewModels是在隨後可被不同地顯示根據它們的類型,但使用相同的ContentControl中的內容的地方。將視圖綁定到視圖模型中的不同屬性很簡單。但是,我必須在模型中保存位置,並且找不到有約束力的解決方案。

1)Application.Save命令在主視圖模型處理,所以我沒有訪問視圖那裏。這意味着當元素移動時我必須保存位置數據,還是有更好的方法?

2)假設我是對1),我期待,以避免後面的代碼,即我不想ContentControl中對付,他們在他們的內容具備的要素。然而,迄今爲止版本後面的代碼是我能想出:

我身後的解決方案到目前爲止的代碼:

所有的模型元素實現一個接口:

public interface IViewElement 
{ 
    String Position { get; set; } 
} 

而在ContentControl中:

void ContentControl_LayoutUpdated(object sender, EventArgs e) 
    { 
     IViewElement content = this.Content as IViewElement; 
     content.Position = new Point(Diagram.GetLeft(this), Diagram.GetTop(this)).ToString(); 
    } 

的XAML:

<Style TargetType="{x:Type diagram:Item}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type diagram:Item}"> 
       <Grid Canvas.Top="{Binding ElementName=PART_ContentPresenter, Path=Content.Position, Mode=TwoWay}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
        ContextMenu="{x:Null}"> 
        <!-- PART_ContentPresenter --> 
        <ContentPresenter x:Name="PART_ContentPresenter" 
         Content="{TemplateBinding Content}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

<DataTemplate DataType="{x:Type local:ViewModel}"> 
<StackPanel> 
    ... 
</StackPanel> 

+0

你可以包括你的XAML直至幷包括canvas標籤? – Rachel 2011-03-31 11:40:25

+0

爲什麼沒有隱藏代碼? – 2011-03-31 11:49:37

回答

1

只是封裝

+0

謝謝,在這種情況下沒有考慮行爲,會嘗試。 – ps23 2011-03-23 12:21:48

1

你爲什麼要使用一個字符串來存儲的位置你的行爲中使用的代碼隱藏?使用Point或兩個十進制值,然後使用雙向綁定將您的ContentControl的Canvas.TopCanvas.Left位置綁定到這些值。

當頂部和左側位置更改它會自動更新模型。

編輯: 下面是一個例子:

<ContentControl Canvas.Top="{Binding ContentModel.Top, Mode=TwoWay}" 
       Canvas.Left="{Binding ContentModel.Left, Mode=TwoWay}" 
       Content="{Binding ContentModel}" /> 
+0

我不想在模型類中使用Point,並且有PointConverter。對於Canvas.Top/Left場景,兩位小數可能是更好的選擇。 – ps23 2011-03-23 12:20:27

+0

@PatrickS我最近做了類似的事情,每個Panel的模型都包含Top和Left的屬性。它效果很好,但要小心窗口大小。在我的情況下,Top/Left屬性實際上是一個百分比,所以當窗口調整大小時,所有的東西都會得到適當的重新定位。 – Rachel 2011-03-23 12:29:27

+0

瑞秋,我現在還不能確定如何將ContentControl中的內容的現在的位置屬性(在演示一個ViewModel,代表由一個DataTemplate)綁定到其父canvas.left /頂 – ps23 2011-03-23 12:55:53

相關問題