2016-01-08 4 views
2

У меня есть один элемент управления ListView и несколько кнопок в приложении WPF. На основе щелчка кнопки я хочу заполнить различные списки результатов из разных классов в список. Все эти разные классы обернуты внутри одного класса (ReportClass), как показано ниже. Кстати, я пытаюсь добиться этого, путем изменения GridView и ItemSource списка из кода. Этот код почти работает. Потому что результаты списка изменяются при нажатии кнопки, но отображаются только имя класса вместо результатов в списке этого класса.Обновление ListView с несколькими Gridview C# WPF

P.S: Я не являюсь экспертом в области XAML/WPF. Но, если есть более простые решения, приветствуются. Благодаря

Вот мой код:

public class animalTypes1 
{ 
    public string type1name { get; set; };  
} 

public class animalTypes2 
{ 
    public string type2name { get; set; }; 
} 

public class ReportClass 
{ 
    public List<animalTypes1> animaltype1 = new List<animalTypes1>(); 
    public List<animalTypes2> animaltype2 = new List<animalTypes2>(); 

} 

    private ObservableCollection<ReportClass> _DynamicreportClass; 
    public ObservableCollection<ReportClass> _DynamicReportSetClass 
    { 
     get 
     { 
      if (_DynamicreportClass == null) 
      { 
       _DynamicreportClass = new ObservableCollection<ReportClass>(); 
      } 
      return _DynamicreportClass; 
     } 

    } 

    public MainWindow() 
    { 
     InitializeComponent();   


     GridView g1 = new GridView(); 
     g1.AllowsColumnReorder = true; 
     g1.ColumnHeaderToolTip = "mammals"; 

     GridViewColumn g1c = new GridViewColumn(); 
     g1c.DisplayMemberBinding = new Binding("type1name"); 
     g1c.Header = "AnimalReport1Header"; 
     g1c.Width = 120; 
     g1.Columns.Add(g1c); 


     GridView g1x = new GridView(); 
     g1x.AllowsColumnReorder = true; 
     g1x.ColumnHeaderToolTip = "mammals"; 

     GridViewColumn g1cx = new GridViewColumn(); 
     g1cx.DisplayMemberBinding = new Binding("type2name"); 
     g1cx.Header = "AnimalReport2Header"; 
     g1cx.Width = 120; 
     g1x.Columns.Add(g1cx); 


     ReportClass allreports = new ReportClass(); 
     allreports.animaltype1.Add(new animalTypes1() { type1name = "Mammals" }); 
     allreports.animaltype2.Add(new animalTypes2() { type2name = "Reptiles" }); 

     this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new System.Action(delegate() 
     { 
      _DynamicReportSetClass.Add(allreports); 

     })); 

    private void btn1_click(object sender, RoutedEventArgs e) 
    { 

     ReportGrid.ItemsSource = _DynamicreportClass[0].animaltype1; 
     ReportGrid.View = g1; 
    } 

    private void btn_click2(object sender, RoutedEventArgs e) 
    { 

     ReportGrid.ItemsSource = _DynamicreportClass[0].animaltype2; 
     ReportGrid.View = g1x; 

    } 

Вот XAML:

<Grid> 
    <WrapPanel Margin="0,0,0,125"> 
     <StackPanel Orientation="Horizontal"> 
      <Button Content="Checkbtn" Click="btn1_click"></Button> 
     </StackPanel> 
     <Button Content="Checkbtn" Click="btn_click2"/> 
    </WrapPanel> 

    <ListView 
     x:Name="ReportGrid" 
     Margin="0,199,0,0" 
     VerticalAlignment="Stretch" 
     HorizontalAlignment="Stretch" 
     HorizontalContentAlignment="Stretch" 
     > 
     <ListView.View> 
      <GridView/> 
     </ListView.View>   
    </ListView> 
</Grid> 
+0

1. XAML не может привязываться к полям, только к свойствам. Добавить {get; задавать; } для всех ваших полей, чтобы они стали свойствами. 2. Ничего не делайте в коде. 3. Пожалуйста, включите свой XAML. Я не уверен, что означает «изменение gridview и itemsource». Является ли это взаимоотношениями между деталями? –

+0

добавлено, как вы упомянули, но не успели – 911Rapid

+0

У вас есть/animaltype1' и 'animaltype2' в ReportClass? –

ответ

1

Существует хорошая причина, чтобы следовать MVVM шаблону для отдельной точки зрения от поведения Текущих случае лучше реализовать сработавший стиль для ListView:..

<ListView 
    Margin="0,199,0,0" 
    VerticalAlignment="Stretch" 
    HorizontalAlignment="Stretch" 
    HorizontalContentAlignment="Stretch"> 
    <ListView.Style> 
     <Style TargetType="ListView"> 
      <Setter Property="ItemsSource" Value="{Binding Source1}"/> 
      <Setter Property="View"> 
       <Setter.Value> 
        <GridView AllowsColumnReorder="True" ColumnHeaderToolTip="mammals"> 
         <GridViewColumn Header="AnimalReport1Header" Width="120" DisplayMemberBinding="{Binding type1name}"/> 
        </GridView> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsSource2}" Value="True"> 
        <Setter Property="ItemsSource" Value="{Binding Source2}"/> 
        <Setter Property="View"> 
         <Setter.Value> 
          <GridView AllowsColumnReorder="True" ColumnHeaderToolTip="mammals"> 
           <GridViewColumn Header="AnimalReport2Header" Width="120" DisplayMemberBinding="{Binding type2name}"/> 
          </GridView> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.Style> 
</ListView> 

И изменение реализации MainWindow

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    protected void OnPropertyChanged(string property) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    #endregion 

    private ObservableCollection<animalTypes1> _source1 = new ObservableCollection<animalTypes1> { 
     new animalTypes1() { type1name = "Mammals" } }; 

    public ObservableCollection<animalTypes1> Source1 
    { 
     get { return _source1; } 
    } 

    private ObservableCollection<animalTypes2> _source2 = new ObservableCollection<animalTypes2> { 
     new animalTypes2() { type2name = "Reptiles" } }; 

    public ObservableCollection<animalTypes2> Source2 
    { 
     get { return _source2; } 
    } 

    private bool _isSource2; 

    public bool IsSource2 
    { 
     get { return _isSource2; } 
     set 
     { 
      if (value != _isSource2) 
      { 
       _isSource2 = value; 
       OnPropertyChanged("IsSource2"); 
      } 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this;   
    } 

    private void btn1_click(object sender, RoutedEventArgs e) 
    { 
     IsSource2 = false; 
    } 

    private void btn_click2(object sender, RoutedEventArgs e) 
    { 
     IsSource2 = true; 
    } 
} 
+0

Спасибо за ваши усилия. Код работает чудесно. Сейчас я буду использовать этот подход. – 911Rapid

0

Я нашел ошибку. Причина, по которой список не обновляется с помощью gridview, был вызван экземпляром Gridview «g1» и «g1x». Ошибка, которую я создал, я имел «g1» и «g1x» как null. И в методе конструктора инстанцировано еще раз, не обновить публично объявленный экземпляр

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