Есть ли простой способ установить большое количество объектов формы WPF? - PullRequest
0 голосов
/ 27 марта 2011

Это просто базовый пример:

if (a == b)
{
    textBox1.Text = "a == b"; 
    textBox1.IsEnabled = true; 
    textBox2.Text = "EXAMPLE2"; 
    textBox2.IsEnabled = false; 
    textBox3.Text = "EXAMPLE3"; 
    textBox3.IsEnabled = false; 
    textBox4.Text = "EXAMPLE4"; 
    textBox4.IsEnabled = false; 
    textBox5.Text = "EXAMPLE5"; 
    textBox5.IsEnabled = false; 
}
else 
{
    textBox1.Text = "a != b"; 
    textBox1.IsEnabled = false; 
    textBox2.Text = "EXAMPLE2"; 
    textBox2.IsEnabled = true; 
    textBox3.Text = "EXAMPLE3"; 
    textBox3.IsEnabled = true; 
    textBox4.Text = "EXAMPLE4"; 
    textBox4.IsEnabled = true; 
    textBox5.Text = "EXAMPLE5"; 
    textBox5.IsEnabled = true;
}  

Это кажется довольно утомительным. Мне было интересно, есть ли лучший способ справиться с такими ситуациями? У меня просто такое ощущение, что все профессионалы не делают ничего, используя этот метод 1x1x1x ....

Ответы [ 2 ]

6 голосов
/ 27 марта 2011

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

С этой целью я перечислил несколько вариантов, которые, как мне кажется, хорошо мне подходят:

Binding

Связывание, особенно в WPF, дает очень мощный способ простого обновления объектов формы. В вашем Xaml вы применяете текст данных (как правило, для формы / окна) и привязанное свойство для каждого объекта, что затем позволяет вам обновлять свойства в вашем коде c # и автоматически отражать их в объектах формы.

Одним из больших преимуществ этого является устранение всего этого утомительного object.Text = "xyz" кода.

В данном примере вы можете ввести логическое свойство TextBoxesEnabled, которое связано со свойством enabled ваших текстовых полей и показывает, является ли a == b.

Доменные объекты

Это следует из подхода связывания - в приведенном выше примере кажется, что все ваши свойства зависят только от двух внешних частей данных («a» и «b»). В этой ситуации вы часто ограничены выполнением чего-то такого же, как и у вас, когда вам нужно установить свойства пользовательского интерфейса в большом количестве процедурного кода.

Однако чаще вы можете представить выразительные доменные объекты, свойства которых сопоставляются непосредственно со свойствами пользовательского интерфейса. Например, возможно, у вас есть объект User со свойством Name, а затем окно пользователя с текстовым полем имени.

Теперь ваш доменный объект будет обеспечиваться вызовами в ваш уровень обслуживания и инфраструктуру доступа к данным, а также из-за привязки, автоматически отображаемой в вашем пользовательском интерфейсе.

Рефакторинг кода

Даже там, где вам нужно установить множество свойств напрямую, без возможности использовать более выразительные объекты и привязку, часто могут быть некоторые простые рефакторинги, которые могут помочь.

В приведенном вами примере кода мне выпрыгнули два простых рефакторинга:

  1. a == b - логическая оценка, поэтому вы можете получить что-то вроде:

    bool enableTextBoxes = a == b;
    
    TextBox1.Enabled = enableTextBoxes;
    TextBox2.Enabled = enableTextBoxes;
    // etc...
    
  2. Вы устанавливаете текст на одну и ту же вещь в ветвях if, поэтому возьмите это из if и просто получите его один раз (хотя я предполагаю, что это только потому, что вы приведем пример кода).

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

1 голос
/ 27 марта 2011

Предполагая, что:
1. ваши элементы управления имеют шаблон myControl1, myControl2 и т. Д. (Например, textBox1, textBox2 и т. Д.)
2. все ваши элементы управления являются потомками одного и того же FrameworkElement родителя (например, все они находятся в пределах Grid)

Вы можете попробовать что-то вроде:

bool shouldEnable = (a == b); //or whatever logic you want to have to decide the enable/disable value

for(i=0; i<10; i++)
{
    string myControlName = "textBox" + i.ToString(); //assuming your pattern to be textBox1, textBox2, etc.
    object myControl = myGrid.FindName(myControlName); //assuming your textboxes present in a Grid named "myGrid"
    if(myControl is TextBox) //assuming your controls to be TextBoxes
    {
        TextBox myTextBox = (TextBox)myControl;
        myTextBox.IsEnabled = shouldEnable;
        myTextBox.Text = "whatever you want based on your logic";
    }
}

Помните:
1. чтобы обратиться к FindName на MSDN: FrameworkElement.FindName
2. если все ваши элементы управления не принадлежат одному из родителей, вы можете взглянуть на: Как найти элементы управления WPF по имени или типу?
3. знать о последствиях для производительности (вы можете проверить это).


Также см .: Найти элементы управления по имени в WPF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...