2012-06-22 53 views
1

我想将Groupboxes绑定到我的stackpanel。将groupboxes绑定到可能的stackpanel

C#:

internal ObservableCollection<GroupBox> BindingTest 
{ 
    get 
    { 
     ObservableCollection<GroupBox> collection = new ObservableCollection<GroupBox>(); 
     for (int counter = 0; counter < 5; counter++) 
     { 
      GroupBox groupBox = new GroupBox(); 
      groupBox.Header = " ... Header ... "; 
      groupBox.Content = " ... Content ... "; 
      collection.Add(groupBox); 
     } 

      return collection; 
    } 
} 

和XAML代码:

<StackPanel x:Name="Dynamic" Grid.Row="1" Margin="29,118,6,0"> 
    <ItemsControl ItemsSource="{Binding Path=BindingTest}" Height="482"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <GroupBox> 
        <GroupBox.Header>{Binding Path=Header}</GroupBox.Header> 
        <GroupBox.Content>{Binding Path=Content}</GroupBox.Content> 
       </GroupBox> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</StackPanel> 

在哪里呢我的错误推理?

+0

首先,不需要的StackPanel;你只需要ItemsControl。其次,你DataContext设置为“this”? – benjer3

+0

@ benjer3 1:ok;)2:它设置为我的视图模型BindingTest所在的位置 – David

回答

1

在WPF绑定中,您通常不会绑定到控件,只需绑定到对象并让标记处理UI细节。理想情况下,您的对象应实现INotifyPropertyChanged以通知绑定属性更改。控制创建已由DataTemplate处理,它已为您创建GroupBox并将其属性绑定到绑定中使用的对象的属性。

您的ViewModel应该,如果可能的话,而不是知道UI的任何事情,或使用任何控件。 MVVM模式旨在分离UI和数据/逻辑。

类的数据对象可以是这个样子:

public class DataObject : INotifyPropertyChanged 
{ 
    private string header; 
    private string content; 

    public string Header { 
     get { return header; } 
     set { header = value; RaisePropertyChanged("Header"); } 
    } 

    public string Content { 
     get { return content; } 
     set { content= value; RaisePropertyChanged("Content"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) { 
     var handler = PropertyChanged; 
     if (handler != null) { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

绑定到也看不同的属性:

internal ObservableCollection<DataObject> BindingTest 
{ 
    get 
    { 
     ObservableCollection<DataObject> collection = new ObservableCollection<DataObject>(); 
     for (int counter = 0; counter < 5; counter++) 
     { 
      DataObject item = new DataObject(); 
      item.Header = " ... Header ... "; 
      item.Content = " ... Content ... "; 
      collection.Add(item); 
     } 

      return collection; 
    } 
} 

我想创建一个新的集合时间该物业被访问仅用于测试目的。

0

BindingTest财产只是变成public场..。它会自动将数据绑定到UI ...

基本上XAML允许你在公共属性绑定到用户界面,因为我们有限制比其他像内部和私有字段..

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 


     public ObservableCollection<GroupBox> BindingTest 
     { 
      get 
      { 
       ObservableCollection<GroupBox> collection = new ObservableCollection<GroupBox>(); 
       for (int counter = 0; counter < 5; counter++) 
       { 
        GroupBox groupBox = new GroupBox(); 
        groupBox.Header = " ... Header ... "; 
        groupBox.Content = " ... Content ... "; 
        collection.Add(groupBox); 
       } 

       return collection; 
      } 
     } 
    } 

XAML代码如下

<Grid > 
     <StackPanel x:Name="Dynamic" > 
      <ItemsControl ItemsSource="{Binding BindingTest, RelativeSource={RelativeSource AncestorType={x:Type this:MainWindow}}}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <GroupBox Header="{Binding Path=Header}" 
            Content="{Binding Path=Content}"> 
         </GroupBox> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </StackPanel> 
    </Grid> 
相关问题