Добавление содержимого WPF динамически - PullRequest
0 голосов
/ 28 октября 2018

Я хотел бы создать класс, содержащий, например, поле «Метка и текст».Может это отличается.Я хотел бы создать и добавить этот объект динамически.

Я хотел бы привязать эти данные к своим свойствам и, конечно же, немедленно показать изменения:

Мои шаги:

  1. Создать класс, например, WpfObject
  2. Создать новую метку
  3. Создать новую TextBox
  4. Создать свойство
  5. Конструктор с параметрами или без параметров
  6. Конструктор содержит параметры привязки данных

Я следовал учебнику WPF на странице wpf-tutorial, также проверил msdn на наличие подсказок и попытался сделать аналогично, чтобы не забыть ни одного шага.Конечно я пытался гуглить где проблема может быть.

Путем отладки я обнаружил, что onPropertyChanged соотв.PropertyChanged по-прежнему возвращает ноль.

Ну я не знаю на что мне смотреть.Я пытался узнать что-то из других проблем, изложенных здесь, или в Интернете, но, возможно, я что-то понял неправильно или что-то забыл.

Поэтому хотел бы попросить какой-нибудь намек или помочь.

Здесь я добавляю свой код:

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

    List<infoObject> LinfoObjectList = new List<infoObject>();

    private void btnAddBox_Click(object sender, RoutedEventArgs e)
    {
        infoObject theObject = new infoObject("theinfo");
        LinfoObjectList.Add(theObject);
        mainGrid.Children.Add(theObject.AddLabel());
        mainGrid.Children.Add(theObject.AddTextbox());
    }

    private void btnCustomBox_Click(object sender, RoutedEventArgs e)
    {
        foreach(var item in LinfoObjectList)
        {
            item.ChangeInfoObject();
        }
    }
}

public class infoObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    string _sTheText;

    string STheText
    {
        set { _sTheText = value;
            OnPropertyChanged("sTheText");
        }

        get { return _sTheText; }
    }

    Label theLabel = new Label();
    TextBox theTextBox = new TextBox();

    int i;

    public infoObject(string _objectName){
        STheText = " ";
        i = 0;
        theLabel.Width = 100;
        theLabel.Height = 25;
        theLabel.Content = _objectName;

        theTextBox.Width = 100;
        theTextBox.Height = 30;
        theTextBox.Text = STheText.ToString();


        Binding binding = new Binding();
        binding.Path = new PropertyPath("sTheText");
        theTextBox.SetBinding(TextBox.TextProperty, binding);
    }

    public void ChangeInfoObject()
    {
        STheText = "textWasChanged"+i.ToString();
        i = +1;
    }

    public Label AddLabel()
    {
        return this.theLabel;
    }

    public TextBox AddTextbox()
    {
        return this.theTextBox;
    }

    public void OnPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}

edit: чтобы уточнить, что я хотел бы сделать:

Я хотел бы сделать какую-нибудь библиотеку или что-то в этом роде.и так далее, и в будущем я смогу создавать текстовые поля, метки, кнопки, например, для каждого элемента, который я сохранил в списке или где-либо еще.

Так что я просто добавлю, например, Element.add (начальная позиция, левое поле, topmargin, root-name, otherparams), и он создаст эти динамически упомянутые, и я избавлюсь от позиционирования, помещая в сетку, для каждогоэлемент.

...