Передача параметров в CollectionViews - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь написать свою первую реализацию привязки данных в форме WPF.

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

Чтобы лучше объяснить мою проблему, это текущее представление, поддерживающее мое приложение.

class SchoolBookViewModel
{
    public SchoolBookViewModel() { }

    //Problem is here... How do I pass in the SelectedSchoolClassID?
    public CollectionView ClassBookListEntries(Guid SelectedSchoolClassID)
    {
        return new CollectionView(SchoolQuoteList.GetSchoolClassQuoteListBySchoolClassID(SelectedSchoolClassID, 2011, "MyConnectionString"));
    }

    public CollectionView SchoolEntries
    {
        get
        {
            return new CollectionView(SchoolList.GetSchoolList("MyConnectionString"));
        }
    }

}

И это XAML

<StackPanel Height="449" HorizontalAlignment="Left" Margin="12,12,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="650" DataContext="{Binding}">
      <Label Content="School:" Height="28" Name="lblSchoolName" Width="651" />
      <ComboBox Height="23" Name="cmbSchoolNames" Width="644" DisplayMemberPath="SchoolName" ItemsSource="{Binding Path=SchoolEntries}" SelectedValuePath="SelectedSchoolClassID" SelectionChanged="cmbSchoolNames_SelectionChanged" />
      <Label Content="Class booklist:" Height="29" Name="label1" Width="651" />
      <ListView Height="163" Name="lblClassBookList" Width="645" ItemsSource="{Binding Path=ClassBookListEntries}" DisplayMemberPath="QuoteReference" />
</StackPanel>

А в методе Window_Loaded я вызываю

stackPanel1.DataContext = new Views.SchoolBookViewModel(); 

Я даже на правильном пути?Любое руководство будет оценено.

1 Ответ

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

Чтобы вернуть выбор ComboBox обратно в ViewModel, вам нужно свойство, чтобы привязать одно из его свойств выбора. Вы также можете избавиться от явных CollectionViews, если вы ничего с ними не делаете. Просто связывая коллекции напрямую, экземпляры ICollectionView будут создаваться и управляться для вас автоматически. Попробуйте структурировать свою виртуальную машину так:

class SchoolBookViewModel : INotifyPropertyChanged
{
    private SchoolList _selectedSchoolClass;
    public SchoolList SelectedSchoolClass
    {
        get { return _selectedSchoolClass; }
        set
        {
            _selectedSchoolClass = value;
            ClassBookListEntries = SchoolQuoteList.GetSchoolClassQuoteListBySchoolClassID(_selectedSchoolClass.Id, 2011, "MyConnectionString");
            NotifyPropertyChanged("SelectedSchoolClass");
        }
    }

    private SchoolQuoteList _classBookListEntries;
    public SchoolQuoteList ClassBookListEntries
    {
        get { return _classBookListEntries; }
        set
        {
            _classBookListEntries = value;
            NotifyPropertyChanged("ClassBookListEntries");
        }
    }

    private SchoolList _schoolEntries;
    public SchoolList SchoolEntries
    {
        get
        {
            if (_schoolEntries == null)
                _schoolEntries = SchoolList.GetSchoolList("MyConnectionString");
            return _schoolEntries;
        }
    }
    ...
}

В общем случае лучше не устанавливать явные значения ширины и высоты, а вместо этого предоставлять элементы размера системы разметки. Вы также можете избавиться от DataContext = "{Binding}" - это избыточно, поскольку DataContext наследуется, а {Binding} означает значение самого DataContext. Вот XAML, очищенный и привязанный к новым свойствам сверху:

<StackPanel HorizontalAlignment="Left" Margin="12,12,0,0" x:Name="stackPanel1" VerticalAlignment="Top">
    <Label Content="School:" x:Name="lblSchoolName" />
    <ComboBox x:Name="cmbSchoolNames" DisplayMemberPath="SchoolName" ItemsSource="{Binding Path=SchoolEntries}"
              SelectedItem="{Binding SelectedSchoolClass}" />
    <Label Content="Class booklist:" x:Name="label1" />
    <ListView x:Name="lblClassBookList" ItemsSource="{Binding Path=ClassBookListEntries}" DisplayMemberPath="QuoteReference" />
</StackPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...