2016-01-11 2 views
1

Моя проблема заключается в том, что я добавляю 2 объекта типа файлов (для целей тестирования) в Viewmodel, который является наблюдаемым коллекцией, но представление не будет обновляться с запуском заявление. Вот в Mainview.cs:MVVM ListView с Viewmodel типа Observable Collection, не обновляющий вид

public class MainView:ObservableCollection<Files> 
{ 
    public MainView() 
    { 
     Files x = new Files("picture", "jpg"); 
     Files x1 = new Files("soundfile", "mp3"); 
     Add(x); 
     Add(x1); 
    }} 

Что я сделал не так? И как избежать этой ошибки? Действительно ли требуется INotifyPropertyChanged, если я не изменю свойства в классе «Файлы» и хочу только обновить представление, если создается новый объект File?

Я получил этот класс:

public class Files:INotifyPropertyChanged 
{ 
    private String _fileName; 

    public String FileName 
    { 
     get { return _fileName; } 
     set { _fileName = value; OnPropertyChanged("FileName"); } 
    } 
    private String _dataType; 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    public String DataType 
    { 
     get { return _dataType; } 
     set { _dataType = value; OnPropertyChanged("DataType"); } 
    } 
    public Files(string filename, string dataType) 
    { 
     this._fileName = filename; 
     this._dataType = dataType; 
    } 
} 

И это ViewModel:

public class MainView:ObservableCollection<Files> 
{ 
    public MainView() 
    { 
     Files x = new Files("picture", "jpg"); 
     Files x1 = new Files("soundfile", "mp3"); 
     Add(x); 
     Add(x1); 
    } 
} 

И сделал это в XAML:

<Window x:Class="ClientTestDesign.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:ClientTestDesign" 
    xmlns:vm="clr-namespace:ClientTestDesign.ViewModel" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" 
    > 
<Window.Resources> 
    <vm:MainView x:Key="View"></vm:MainView> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="75"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <Button Grid.Column="0" Style="{DynamicResource ForwardBackButton}" Content="Back"></Button> 
    <Button Grid.Column="1" Style="{DynamicResource StopButton}" Content="Pause"></Button> 
    <Button Grid.Column="2" Style="{DynamicResource ForwardBackButton}" Content="Forward"></Button> 
    <ListView Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.ColumnSpan="3"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding /FileName, Source={StaticResource View}}"></TextBlock> 
        <TextBlock Text="{Binding /FileName, Source={StaticResource View}}"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

+0

Это больше понимания вопроса. Ваш класс 'Files' должен быть вашим ViewModel. 'Files' должен быть свойством в ViewModel. –

+0

@ KosalaW Вы имеете в виду, что файлы должны быть наблюдаемой коллекцией? и моя fviewmodel должна содержать атрибуты файлов? –

+0

@ KosalaW Это не может быть единственной ошибкой, не так ли? Я изменил его, не получилось –

ответ

2

Измените свой код следующим образом:

Ваш класс «Файл»; Здесь нет больших изменений. Но посмотрите, как я реализовал свойства и OnPropertyChanged.

using System.ComponentModel; 

namespace WpfApplication1 
{ 
public class File:INotifyPropertyChanged 
{ 
    private string _fileName; 
    private string _dataType; 

    public string FileName 
    { 
     get { return _fileName; } 
     set 
     { 
      _fileName = value; 
      OnPropertyChanged("FileName"); 
     } 
    } 

    public string DataType 
    { 
     get { return _dataType; } 
     set 
     { 
      _dataType = value; 
      OnPropertyChanged("DataType"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
} 

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

using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Windows.Input; 

namespace WpfApplication1 
{ 
    public class MainWindowViewModel1:INotifyPropertyChanged 
    { 
     private ObservableCollection<File> _files; 
     private File _selectedFile; 
     //private ICommand _getFiles; 

     public ObservableCollection<File> Files 
     { 
      get { return _files; } 
      set 
      { 
       _files = value; 
       OnPropertyChanged("Files"); 
      } 
     } 

     public File SelectedFile 
     { 
      get { return _selectedFile; } 
      set 
      { 
       _selectedFile = value; 
       OnPropertyChanged("SelectedFile"); 
      } 
     } 

     //public ICommand GetFiles 
     //{ 
     // get { return _getFiles; } 
     // set 
     // { 
     //  _getFiles = value; 
     // } 
     //} 

     //public void ChangeFileName(object obj) 
     //{ 
     // Files[0].FileName = "File_" + new Random().Next().ToString(CultureInfo.InvariantCulture); 
     //} 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public MainWindowViewModel1() 
     { 
      Files = new ObservableCollection<File>(); 
      Files.Add(new File() { FileName = "picture", DataType = "jpg"}); 
      Files.Add(new File() { FileName = "soundfile", DataType = "mp3" }); 
      //GetFiles = new RelayCommand(ChangeFileName, param => true); 
     } 
    } 
} 

Ваш взгляд; Посмотрите на привязки. Это была одна из ваших проблем.

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:vm="clr-namespace:WpfApplication1"> 
<Window.Resources> 
    <vm:MainWindowViewModel1 x:Key="View"></vm:MainWindowViewModel1> 
</Window.Resources> 
<Grid> 
    <ListView HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Source={StaticResource View}, Path=Files, Mode=TwoWay}" SelectedItem="{Binding Source={StaticResource View}, Path= SelectedFile, Mode=TwoWay}" Margin="28,27,31,146"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Path= FileName, Mode=TwoWay}"></TextBlock> 
        <TextBlock Text="{Binding Path= DataType, Mode=TwoWay}"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    <!--<Button Content="Refresh" Command="{Binding Source={StaticResource View},Path = GetFiles}" HorizontalAlignment="Left" Height="33" Margin="347,236,0,0" VerticalAlignment="Top" Width="139"/>--> 
</Grid> 

+0

Я даю это попробовать –

+0

Это сработало, я использовал ваш код и удалил все мои дополнительные сетки и столбцы + rowdefinitions, тогда это сработало. Спасибо, лучше hava наблюдаемая коллекция как объект в списке, im рад своей работе: D –

1

Вы должны установить управления ListView ItemsSource. В этом случае это то же самое, что и ваш DataContext, поэтому просто выполните это:

<ListView ItemsSource="{Binding}" ... etc... 
+0

Не работал, не является ItemSource inherita из DataContext, если он не установлен явно –

+0

Нет, он полностью отделен от DataContext. Это сработало для меня, используя код, который вы отправили, поэтому вы должны делать что-то еще, что вы не показали нам. –

+0

Итак, есть 2 списковых объекта, видимых для вас? Я ничего не изменил, это не сработало :( –

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