2013-06-05 2 views
0

У меня есть наблюдаемая коллекция OBSCollection, которую я разбираю. В этой коллекции я проверяю, является ли свойство имени «критическим», и если оно «критично», то я пытаюсь динамически создавать красные кнопки для каждого появления свойства.Создание кнопок динамически из наблюдаемой коллекции

if (OBSCollection.Any(p => p.Name == "Critical")) 
        { 

         criticalcount = OBSCollection.Where(x => x.Name == "Critical").ToList().Count; 

         for (int i = 0; i < criticalcount; i++) 
         { 
          Button temp = new Button(); 
          temp.Background = new SolidColorBrush(Windows.UI.Colors.Red); 
          temp.Width = 200; 
          temp.Height = 100; 
          temp.Content = "Critical"; 
          CriticalPanel.Children.Add(temp); 
          temp.Tapped += new TappedEventHandler(bTapped_Tapped); 
         } 
private void bTapped_Tapped(object sender, TappedRoutedEventArgs e) 
     { 
      var toremovecritical = OBSCOllection.Where(x => x.Name == "critical").First(); 
      uiElements.Remove(toremovecritical); 
     } 

Теперь приведенный выше код работает только в том случае, если существует одно свойство «Критическое». Как я могу переписать код для работы в нескольких случаях и, следовательно, создать несколько кнопок?

Также после отображения кнопок, если пользователь нажимает кнопку, свойство видимости кнопок должно быть свернуто и этот конкретный элемент должен быть удален из наблюдаемой коллекции. Я могу удалить кнопку из наблюдаемой коллекции, но я не могу установить для свойства видимости кнопки значение false из обработчика bTapped_Tapped. Есть ли способ разрешить это?

+0

не отвечает на ваш прямой вопрос, но IMHO это кричит для шаблона данных (в вашем ListView или GridView), который включает в себя кнопку и устанавливает видимость на Visible, когда значение Name является «Critical» (через конвертер в привязке). Таким образом, вы удаляете весь код (за исключением обработки нажатия кнопок) и сохраняете разделение проблем между вашим представлением (Button) и вашим ViewModel (OBSCollection). –

+0

Если вы поставили точку останова на итерации, у вас есть критический граф выше thant 1? Кроме того, если вы поставили точку останова после итерации, если вы проверите CriticalPanel.Children, у вас есть более одного ребенка? – Oliver

+0

@Oliver прямо сейчас, я знаю, что у меня есть только один ребенок, поэтому код работает. Моя проблема в том, что если существует более 1 «критического», тогда мой код попытается создать несколько кнопок с тем же именем, что вызовет ошибку. – Boncek35

ответ

0

Вот ВАЖНО базовый пример с использованием MVVM.

XAML:

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
    <GridView ItemsSource="{Binding Things}"> 
     <GridView.ItemTemplate> 
      <DataTemplate> 
       <Button Width="100" Height="100" Background="Red" Content="{Binding Name}" Click="CriticalClick" DataContext="{Binding}"></Button> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 

</Grid> 

ViewModel & Модель:

public class ThingViewModel 
{ 
    public ObservableCollection<Thing> Things { get; set; } 

    public ThingViewModel() 
    { 
     var allThings = new List<Thing>(); 

     for (int i = 0; i < 30; i++) 
     { 
      if (i % 2 == 0) 
       allThings.Add(new Thing { Name = "Critical" }); 
      else 
       allThings.Add(new Thing { Name = "`NonCritical" }); 
     } 

     this.Things = new ObservableCollection<Thing>(allThings.Where(x => x.Name == "Critical")); 
    } 
} 

    public class Thing 
    { 
     public string Name { get; set; } 
    } 

Код За:

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     this.DataContext = new ThingViewModel(); 
    } 

    private void CriticalClick(object sender, RoutedEventArgs e) 
    { 
     var tappedThing = (Thing) ((Button) sender).DataContext; 

     ((ThingViewModel) this.DataContext).Things.Remove(tappedThing); 
    } 

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

Надеюсь, это поможет.

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