如何在按钮上创建新面板?

时间:2013-10-01 14:19:59

标签: c# .net wpf

我的WPF应用程序界面需要一些非常不同的东西。实际上我的应用程序中有动态按钮。现在我想要,因为我点击按钮它的面板应该创建并打开以在其文本框中添加一些内容以保存在数据库中!同样,格式文本框应该使用打开的面板进行更新,因为下图显示了所有内容。

如何区分面板文本框以将文本保存在数据库的文本框中?

enter image description here

修改

我没有使用MVVM!

1 个答案:

答案 0 :(得分:1)

我希望你只是要求对这个问题采取一般方法,因为我不会费心去编码这些东西。
所以这就是:

  1. 为您的面板创建用户控件。由于它们都相同,因此使用属性来存储创建面板按钮的值。
  2. 创建Panel控件的ObservableCollection,您将在此处存储新添加的面板。
  3. 创建ItemsControl以显示您的面板并将ObservableCollection指定为该面板的ItemsSource。这样,如果您向集合中添加内容,它将显示在您的GUI上
  4. 将一个事件附加到您的按钮,在这种情况下您将(实例化一个新面板) - > (将面板的ID设置为“button1”,“button2”,“button3”或者您想要区分) - > (将面板添加到ObservableCollection)
  5. 当你完成并想要获得所有面板等时,你可以简单地遍历你的ObservableCollection并在那里选择pannels / values。您还可以使用linq按按钮ID等过滤面板。
  6. 还有其他问题,请问:)

    - EDIT--
    1.正如我所说,创建一个将成为您的面板的用户控件。这样,您可以在按钮单击事件的代码(xaml.cs文件)中实例化它,就像实例化任何其他类的对象一样。
    2.当您创建面板用户控件时,我们将其称为MyPanel,在后面的代码中添加一个属性并随意调用它(ParentButton可能?)。现在您可以添加一个构造函数,该构造函数将按钮ID作为参数,或者您可以简单地使用标准构造函数,然后在将面板添加到集合之前将按钮ID分配给该属性。

    - EDIT--
    这是my struggles with ObservableCollection的链接。在那里,您可以找到一种快速简单的方法将集合附加到列表并处理更改 在{1}} INotifyPropertyChanged上,您可以在面板中实现该界面(可能) 关于ObservableCollections的Microsoft tutorial 关于如何将数据绑定到列表等的Microsoft tutorial 现在请记住:他们在教程中使用简单的对象,但您可以以相同的方式使用用户控件 再一次,这是很多阅读,但你必须自己做...祝你好运:)

    - EDIT--
    实际上,您甚至不必创建用户控件,只需创建一个包含您想要保存的数据的对象,如下所示:

    class MyPanel: INotifyPropertyChanged
    {
        private string _id;
        private string _text;
    
        public string Id
        {
            get { return _id; }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    NotifyPropertyChanged();
                }
            }
        }
        public string Text
        {
            get { return _text; }
            set
            {
                if (value != _text)
                {
                    _text= value;
                    NotifyPropertyChanged();
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    然后将控件添加到您要显示面板的应用程序窗口中:

    <ItemsControl Name="lstPanels" ScrollViewer.VerticalScrollBarVisibility="Auto">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel orientation="vertical">
                            <TextBlock Text="{Binding Id}">
                            <TextBox Text="{Binding Text, Mode=TwoWay}" />
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
    

    然后添加一个可观察的集合:

    private ObservableCollection<MyPanel> panels = new ObservableCollection<MyPanel>();
    

    在构造函数中将它附加到ItemControl:

    lstPanels.ItemsSource = panels;
    

    然后添加一个添加新面板的功能:

    private void addPanel(string buttonId)
    {
        MyPanel p = new MyPanel { Id = buttonId; };
        panels.add(p);
    }
    

    然后在你的button1 / button2 / button3上点击调用具有相应id的函数:

    addPanel("button1");
    addPanel("button2");
    

    如果要完成并遍历面板,请在panels上使用标准foreach或for循环:)