2010-09-17 79 views
0

我寫一個WPF應用中,我需要顯示自定義文件見識它由字段名&它的價值。我生成了標籤爲&的網格朗姆酒。我在文本框中的標籤&字段值中顯示字段名稱(我希望它是可編輯的)。 &每次文件選擇的變化,場變化&所以網格列&行數。現在我在後面的代碼中生成這個網格。有沒有什麼辦法可以在XAml中使用視圖模型來完成它。生成動態網格在MVVM模式

回答

1

我不知道爲什麼你創建這個電網在運行時。您應該考慮使用標準的演示方法,如帶有自定義項目模板的<ListBox>。總是期望使用UI的聲明定義(在XAML中)而不是代碼隱藏。

我有一個blog post創建一個選中的列表框,顯示一些細節,但你應該能夠找到其他好的例子。

1

這是很容易與ItemsControl做。如果視圖模型公開元數據對象的名單,說一類是這樣的:

public class FileMetaData : INotifyPropertyChanged 
{ 
    private string name; 
    private string value; 

    public event PropertyChangedEventHandler PropertyChanged = (o, e) => { }; 

    public string Name 
    { 
     get { return name; } 
     set 
     { 
      name = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    public string Value 
    { 
     get { return value; } 
     set 
     { 
      this.value = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Value")); 
     } 
    } 
} 

然後,你的視圖模型將其公開爲ObservableCollection(所以當新的項目被添加或刪除WPF知道):

public class MyViewModel 
{ 
    ... 
    public ObservableCollection<FileMetaData> Files { get; private set; } 
    ... 
} 

然後,你的觀點將使用ItemsControlItemTemplate進行顯示:

<ItemsControl ItemsSource="{Binding Files}" Grid.IsSharedSizeScope="True"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" SharedSizeGroup="one" /> 
        <ColumnDefinition Width="Auto" SharedSizeGroup="two" /> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="{Binding Name}" /> 
       <TextBox Grid.Column="1" Text="{Binding Value}" /> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

注意,我設置Grid.IsSharedSizeScopeItemsControl上爲true,所以列將對齊。如果您有大量數據,則可能需要將其包裝在ScrollViewer(或者更好地重新設定ItemsControl)。

+0

謝謝你的回答。這看起來不錯,但另一個要求是,它不會被顯示爲一列,而是取決於字段,我們將決定運行時多少列網格將基本上水平分佈。所以smtime列cms爲5或4,無論如何。那麼是否可以將columndefination運行時添加到數據模板? (請原諒如果u發現這個很基本的,我是新來WPF) – Rik 2010-09-17 22:11:56

+0

這將生成一個數字,有標籤/文本框輸入(因爲用於一個ItemsControl默認面板是垂直的StackPanel)的行。如果你想切換這個,這樣每個項目都是水平排列的,你需要將ItemsControl.ItemsPanel設置爲水平方向的StackPanel。 WPF博士在他的博客上有一個很棒的系列解釋ItemsControl。這是第一篇文章的鏈接:http://drwpf.com/blog/2007/10/15/itemscontrol-a-is-for-abundance/ – 2010-09-20 13:57:47

+0

GR8,我會嘗試。謝謝您的幫助 !!!我相信appriciate它。 – Rik 2010-09-20 14:50:12