繁体   English   中英

将groupbox绑定到may stackpanel

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM