2010-05-25 138 views
0

我有一個基於網格控件的自定義用戶控件。我有一個ViewModel公開這個屬性。我想在視圖上的XAML綁定到這個。我相信這一定很容易,但對於WPF來說我還是個新手。這是如何實現的?WPF XAML綁定網格

預先

非常感謝(編輯補充的詳細信息)的視圖

實施例而不結合視圖模型。請注意,我有一個自定義網格,其中包含許多自定義堆疊面板,其中包含許多自定義的內容控件。這些是在ViewModel加載期間確定的。

<MyCustomGrid:CustomGrid> 
    <MyCustomGrid:CustomStackPanel> 
     <MyCustomGrid:CustomHeaderedContentControl/> 
    </MyCustomGrid:CustomStackPanel> 
    <MyCustomGrid:CustomStackPanel> 
     <MyCustomGrid:CustomHeaderedContentControl/> 
    </MyCustomGrid:CustomStackPanel> 
</MyCustomGrid:CustomGrid> 

視圖模型只包含其中包含一個列表等。注意,CustomGrid是因爲可能有不止一個,但只有一個具有特定屬性將被綁定列表的列表。

+2

有很多方法可以做到這一點,取決於它是如何設置的。 你可以發表一些關於你的用戶控件和viewmodel的外觀的代碼嗎?當問題情景更具體時,解釋答案會簡單得多。 – ThomasAndersson 2010-05-25 09:48:49

+0

我已更新帖子,謝謝。 – 2010-05-25 09:54:52

回答

0

基本步驟

  1. 設置用戶控件的DataContext的(或控制/窗口,包含用戶控件)一些模型類型的實例,與數據屬性,是一個ObservableCollection<SomeDataType>

  2. ListViewItemSource綁定到Data屬性。

  3. GridViewColumnDisplayMemberBinding財產歸屬於SomeDataType的財產。

因此,你將有這樣的事情:

<ListView SelectionMode="Single" 
      HorizontalAlignment="Stretch" 
      ItemsSource="{Binding Data}"> 
    <ListView.View> 
     <GridView > 
      <GridViewColumn Header="Name of Prop2" 
          DisplayMemberBinding="{Binding Path=Prop1}" /> 
      <GridViewColumn Header="Name of Prop2" 
          DisplayMemberBinding="{Binding Path=Prop2}" /> 
      <GridViewColumn Header="Name of Prop3" 
          DisplayMemberBinding="{Binding Path=Prop3}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

您可以綁定到其他類型,並且有超過格式化等的控制,但是這是一個簡單的情況。

+0

這並不完全給我我想要的。網格,它應該呈現的堆疊面板以及要在這些面板中顯示的內容在ViewModel實例化時在視圖模型中實例化。我只是想在視圖中呈現。對不起,如果我沒有解釋得很好。 – 2010-05-25 10:30:45

+0

@JonArchway:WPF控件將綁定到控件的'DataContext'上的屬性。所以你需要確保你已經將'DataContext'設置爲適當的屬性,並且這些屬性被填充。如果你包含了你想要綁定的結構的某些東西(我懷疑你錯過了一些明顯的東西 - 一旦它被指出)。 – Richard 2010-05-25 12:21:04

+0

好吧,所以如果我在代碼隱藏中這樣做,我可以通過做一些像SomeGridOnTheXamlView.Children.Add(viewModel.MyCustomGrid)添加一切。我想直接在XAML中做這樣的事情?我顯然在這裏很愚蠢,所以隨時指出我的愚蠢! :-) – 2010-05-25 12:34:25

0

我現在還不能確定你要實現什麼,但我有一個去反正,也許我們可以從那裏迭代到一個解決方案。

從上面的XAML判斷,您有幾個自定義控件。你提到的最高級別是基於Grid的。 Grid是在控件中,還是作爲ItemsControl的ItemPanelTemplate?

我有點覺得你想要數據綁定你的viewmodel的內容,並且你需要將你的自定義控件基於ItemsControl。糾正我,如果我錯了。

像這樣的東西(如mentionded,這是假設MyCustomGrid作爲一個ItemsControl:

<UserControl Name="MyCustomGrid"> 
      <ItemsControl ItemsSource="{Binding Path=MyStackPanelsCollection}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Grid IsItemsHost="True" /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemContainerStyle> 
        <Style TargetType="{x:Type MyCustomGrid:MyCustomStackPanel}"> 
         <Setter Property="Grid.Row" Value="{Binding Path=GridRow}" /> 
         <Setter Property="Grid.Column" Value="{Binding Path=GridColumn}" /> 
        </Style> 
       </ItemsControl.ItemContainerStyle> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate DataType="{x:Type MyCustomGrid:MyCustomStackPanelViewModel}"> 
         <ContentPresenter Content="{Binding Path=MySerializedObjectTurnedInToControl}" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </UserControl> 

如果情況並非如此,因爲在你直接綁定您的CustomStackPanel等,以一個指定的屬性在您的視圖模型,它可能看起來像:

<MyCustomGrid:CustomGrid DataContext="{Binding Path=ViewModel}"> 
    <MyCustomGrid:CustomStackPanel DataContext="{Binding Path=MyFirstStackPanelViewModel}"> 

...如果

對不起,我誤會,我仍然很可能是缺少明顯的東西

+0

我認爲我遇到的問題是在XAML中創建視圖時不知道CustomStackPanel。加載後才知道CustomStackPanels的數量。與這些堆疊面板的內容相同。我沒有解釋得很好,這些控件的內容基本上是從文件中加載的。該文件包含一個表示應該加載的序列化對象模型。我有點想簡單地說是否合理? – 2010-05-25 12:17:42

+0

這確實使事情更清楚一點。我仍在考慮爲您的自定義序列化對象基於ItemsControl和DataTemplates的解決方案。我將用示例編輯我的帖子。 – ThomasAndersson 2010-05-25 12:21:36