WPF - заполнить элементом управления данными, который находится внутри другого элемента управления - PullRequest
1 голос
/ 27 ноября 2009

Я написал некоторый код, который заполняет элементы управления некоторыми данными из базы данных. Все работает нормально, если элементы управления помещены прямо в окно. Но как заполнить элементы управления, которые находятся внутри других элементов управления, таких как TabControls, GroupBoxes и т. Д. Мой код выглядит так:

Некоторые окна:

private void LoadDataP()
{
    if (ID.Length > 0)
    {
        if (baseButtons.LoadProcedureSelectName != string.Empty)
            LoadData = SqlHelper.GetTable(baseButtons.LoadProcedureSelectName, new string[] { IdName, ID });
        if (LoadData != null)
            foreach (DataRow dr in LoadData.Rows)
            {
                SqlHelper.FillWindowControllsWithData(myGrid, dr);
            }
    }

}

В другом классе есть методы. Они выполняют основную работу:

public static void FillWindowControllsWithData(Grid windowGrid, DataRow dataRow)
{
    foreach (Control ctrl in windowGrid.Children)
    {
        FillWindowControllsWithData(ctrl, dataRow);
    }
}

public static void FillWindowControllsWithData(Control ctrl, DataRow dataRow)
{
    if (ctrl.Name.IndexOf("db_") == 0)
    {
        if (ctrl is TextBox)
        {
            if (dataRow.Table.Columns.Contains(ctrl.Name.Substring(3)))
            {
                ((TextBox)ctrl).Text = dataRow[ctrl.Name.Substring(3)].ToString();
            }
        }
    } //end if

}

Так кто-нибудь знает, как заполнить данные в текстовом поле, которое находится в каком-то групповом окне или таб-контроле, у которого также есть дети?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2009

Просто чтобы подчеркнуть то, что говорит Dabbleml: написание приложений WPF с использованием методов Windows Forms - это путь к отчаянию и страданиям. Счастливый, радостный и бесплатный способ создания приложений WPF - это использование шаблона MVVM и привязка данных.

Модные слова делают этот звук намного сложнее, чем есть на самом деле. На практике это концептуально довольно просто:

  1. Создай свое окно WPF. Это ваше мнение.

  2. Создайте класс, который предоставляет каждый фрагмент данных, который ваше окно будет отображать как свойство. Это ваша модель взгляда. Добавьте метод к классу, который заполняет его из источника данных. (Это, кстати, ваша модель. Теперь вы можете сказать, что используете шаблон MVVM и производите впечатление на девушек на вечеринках.)

  3. Создайте контекст данных в вашем окне WPF, в котором будет храниться экземпляр этого класса, и привяжите элементы управления к свойствам класса.

Что происходит, когда вы делаете это: реальный код, который вы пишете, включает манипулирование данными, а не пользовательский интерфейс. Когда кто-то приходит к вам и спрашивает, может ли ваше окно отображать какую-то танцующую болонью, когда возникает какое-то странное состояние, вы не пишете код пользовательского интерфейса; Вы просто добавляете свойство к своей модели представления и привязываете к нему элемент танцевальной болоньи в своем представлении.

1 голос
/ 28 ноября 2009

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

public void FillWindowControllsWithData(FrameworkElement element, DataRow dataRow)
{
    if (element is TextBox) 
   {
        if (element.Name.StartsWith("db_")
        {
            if (dataRow.Table.Columns.Contains(element.Name.Substring(3)))
            {
                ((TextBox)element).Text = dataRow[element.Name.Substring(3)].ToString();
            }
        }
    } 
     else if(element is Panel)
    {
       foreach(FrameworkElement el in ((Panel)element).Children)
       {
          FillWindowControllsWithData(el, dataRow);
       }
    }
    else if(element is ContentControl)
    {
      FillWindowControllsWithData(((ContentControl)element).Content, dataRow);
    }
    //else do nothing
}

Тем не менее, это определенно не способ сделать это. Вы должны заполнить свои элементы управления через привязку данных. Запустите здесь , чтобы начать. Удачи!

...