在WPF中使用DataBinding创建动态控件

时间:2013-01-17 06:37:42

标签: c# wpf data-binding

我有一个对象,我正在通过我的用户控件作为属性。然后循环遍历对象属性,并根据订单日在运行时在不同的选项卡中创建控件。 请仔细阅读附图,以便更好地理解。

它的工作正常,但这是WINFORM类型,是否有可能在运行时使用WPF绑定,依赖属性或类似的东西创建控件。

enter image description here

enter image description here

由于

1 个答案:

答案 0 :(得分:0)

  

是否可以使用WPF绑定在运行时创建控件

是的,有可能。这就是数据模板的用途。基本规则是:不要创建控件,创建数据并显示模板,该模板定义了数据的表示方式:

public class ComponentViewModel : ViewModel /* ViewModel is a basic implementation of INotifyPropertyChanged interface */
{
    public ComponentViewModel()
    {
        this.Items = new ObservableCollection<ItemViewModel>
        {
            new ItemViewModel { IsActive = true, DateTime = DateTime.Now, Name = "Lemons" },
            new ItemViewModel { IsActive = true, DateTime = DateTime.Now, Name = "Melons" },
            new ItemViewModel { IsActive = true, DateTime = DateTime.Now, Name = "Apples" },
        };
    }

    public ObservableCollection<ItemViewModel> Items { get; private set; }
}

public class ItemViewModel : ViewModel
{
    public bool IsActive
    {
        get { return isActive; }
        set
        {
            if (isActive != value)
            {
                isActive = value;
                OnPropertyChanged("IsActive");
            }
        }
    }
    private bool isActive;

    public string Name
    {
        get { return name; }
        set
        {
            if (name != value)
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
    }
    private string name;

    public DateTime DateTime
    {
        get { return dateTime; }
        set
        {
            if (dateTime != value)
            {
                dateTime = value;
                OnPropertyChanged("DateTime");
            }
        }
    }
    private DateTime dateTime;
}

代码隐藏:

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

XAML:

                                                                                                                                                         

                <CheckBox Grid.Column="0" IsChecked="{Binding IsActive}" Content="{Binding Name}"/>
                <TextBox Grid.Column="1" Text="{Binding DateTime}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>