[英]binding groupboxes to may 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>
我的推理错误在哪里?
在WPF绑定中,通常不绑定到控件,而只绑定到对象并让标记处理UI详细信息。 理想情况下,您的对象应实现INotifyPropertyChanged
来通知Binding属性更改。 控件的创建已经由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;
}
}
我假设每次访问该属性时都创建一个新的Collection只是出于测试目的。
只需将BindingTest
属性更改为public
字段即可。它将自动将数据绑定到UI。
基本上xaml允许您将公共属性绑定到UI,因为我们对内部和私有等其他字段有限制。
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.