2014-09-05 2 views
0

Есть ли способ написать свойство C# one для нескольких элементов. например У меня 5 кнопок, я не хочу писать button1.text = "etc", button2.text = "etc, я хочу написать button.text="etc" и иметь button1.text через button5.text, чтобы иметь текст «и т. д.».Одно свойство для нескольких кнопок

+0

Вы можете создать массив. – SLaks

+1

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

ответ

1

Вы не можете назначить все 5 кнопок одинаковой ссылки, так что будет работать button.text = "etc".

Однако вы можете связать кнопки с тем же свойством:

<Button Content="{Binding myText}"/> 
<Button Content="{Binding myText}"/> 
<Button Content="{Binding myText}"/> 
<Button Content="{Binding myText}"/> 

Если привязка правильно установлен с INotifyPropertyChanged, то все будет обновляться при myText обновляется.

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

+0

+1 Не думал об использовании привязок. –

2

Я думаю, что это возможно с чем-то подобным к:

public void SetButtonText(string value) { 
    this.Controls.OfType<Button>().ToList().ForEach(b => b.Text = value); 
} 

Или же через свойство:

public string ButtonText { 
    set { 
     Controls 
      .OfType<Button>() 
      .ToList() 
      .ForEach(b => b.Text = value); 
    } 
} 

EDIT

После дальнейших исследований, я выяснил, что нет прямого доступа к элементам управления страницей на Windows Phone, как я знаю. Так что все зависит от того, хотите ли вы спуститься с PhoneApplicationPage:

Как я вижу, ваше решение вращается вокруг Page.LogicalChildren Property.

public class MyPage : Page { 
    public string ButtonText { 
     set { 
      LogicalChildren 
       .OfType<Button>() 
       .ToList() 
       .ForEach(b => b.Text = value); 
     } 
    } 
} 

Поскольку LogicalChildren имеет защищённый аксессор, вам нужно получить к нему доступ через производный класс, который должен быть удобным для любого вида страницы, вы работаете на Windows Phone, я думаю.

Или оставьте Grid прямо на PhoneApplicationPage, а затем опустите на него другие элементы управления, такие как ваши кнопки, затем вы получите к ним доступ через свойство Grid.Children.

Так что, уронили Grid и назвав его myBaseGrid, можно было бы сделать следующее:

public void SetButtonsText(string text) { 
    myBaseGrid.Children 
     .OfType<Button>() 
     .ToList() 
     .ForEach(b => b.Text = "myText"); 
} 

Я бы лично пойти с методом, имя которого становится ясно, что вы делаете по буквам слово Button во множественном числе, как в моем образце.

+0

+1 для «одной линии». Это может быть «Дети», а не «Элементы управления», поскольку его на телефоне 8, хотя – BradleyDotNET

+0

@BradleyDotNET: см. Мое редактирование. –

+0

Спасибо за информацию! Я удивлен, что они избавились от коллекции «Дети» и заменили ее на «LogicalChildren». В любом случае, все же подход, который я использовал бы, если привязка не была вариантом по какой-то причине. – BradleyDotNET

1

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

public void SetAllButtonTexts(string text) 
{ 
    button1.text = text; 
    button2.text = text; 
    // . . . 
} 

В качестве альтернативы можно использовать цикл:

public void SetAllButtonTexts(string btnText) 
{ 
    foreach (var control in this.Controls.OfType<Button>()) 
    { 
     (control).Text = btnText; 
    } 
} 

И если вы не хотите обновлять ВСЕ кнопки, одна простая, но не очень элегантная вещь, которую вы можете сделать, это изменить свойство Tag кнопок, которые вы хотите изменить с помощью специального текста, и только обновлять их:

public void SetAllButtonTexts(string btnText, string tagText = "") 
{ 
    foreach (var control in this.Controls.OfType<Button>() 
     .Where(b => string.IsNullOrEmpty(tagText) 
      || (b.Tag != null && b.Tag.Equals(tagText)))) 
    { 
     (control).Text = btnText; 
    } 
} 
+0

+1 В отличие от моего ответа, кроме синтаксиса 'foreach loop'. Он будет работать. –

+1

Истинный ...Я не видел вашего ответа до того, как отправил сообщение. Великие умы ...: p –

+0

Хехеэ ... Я знаю, что иногда есть несколько параллелизма по ответам. Вы, вероятно, писали свои, когда я разместил свой. ;) Великие умы, тем не менее! = Р –

0

В нескольких словах: Группируйте все свои кнопки, которые должны быть изменены в списке. Затем перейдите через этот список и установите текст всех кнопок.

Вот несколько кодов.
Прежде всего:

public static List<Button> buttonList = new List<Button>{}; 

На Form_Load:

buttonList.AddRange(new List<Button>{ button1,button2,button3,...}); // Group your buttons 

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

foreach(Button btn in buttonList) 
{ 
    btn.Text = "Change all button-texts from list at one time."; 
} 

Вы также можете обрабатывать несколько таблиц или ящиков и т. Д., Как это. Просто объявите правильный тип данных.

Приветствия

Смежные вопросы