Как получить данные, используя привязку ListView через MVVM в wpf? - PullRequest
5 голосов
/ 05 октября 2010

Я пытаюсь использовать шаблон MVVM, используя Silverlight ListView.Но если я связываю данные, мой контроль Silverlight не визуализирует данные.Также нет ошибки возврата.я вижу пустую сетку.

Модель:

MyData.cs


 public class MyData
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Price { get; set; }
        public string Author { get; set; }
        public string Catalog { get; set; }
    }

Вид:

BookViewer.xaml


<UserControl x:Class="wpf.MVVM.Project.View.BookViewer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="500" Width="700">
    <Grid>
        <StackPanel>
            <ListView Margin="8" Height="400" Width="650" ItemsSource="{Binding Path=MyData}">
         <ListView.View>
                    <GridView >
                        <GridViewColumn Header="ID" Width="Auto">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding ID}" TextAlignment="Right" Width="40"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Header="Name" Width="100"/>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=Price}" Header="Price" Width="100"/>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=Author}" Header="Author" Width="100"/>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=Catalog}" Header="Catalog" Width="100"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </StackPanel>
    </Grid>
</UserControl>

ViewModel:

MyDataViewModel.cs


  public class MyDataViewModel
    {
       // public ObservableCollection<MyData> myData { get; set; }
        public List<MyData> GetData()
        {
            List<MyData> myDataList = new List<MyData>();
            myDataList.Add(new MyData() { ID = 1, Name = "yusuf karatoprak", Author = "Mike Gold", Price = "6.7 TL", Catalog = "IT" });
            myDataList.Add(new MyData() { ID = 2, Name = "yusuf karatoprak", Author = "Scott Gunitella", Price = "9.7 TL", Catalog = "IT" });
            myDataList.Add(new MyData() { ID = 3, Name = "yusuf karatoprak", Author = "David Hayden", Price = "11.7 TL", Catalog = "IT" });
            if (myDataList.Count > 0)
            {
                return myDataList;
            }
            else
                return null;
        }

    }

Window1.xaml

  public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            MyDataViewModel myDataCtx = new MyDataViewModel();
            MyDataDataView.DataContext = myDataCtx.GetData();
        }
    }

<Window x:Class="wpf.MVVM.Project.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="1000" Width="900"
    xmlns:views="clr-namespace:wpf.MVVM.Project.View" Loaded="Window_Loaded">
    <Grid>
        <views:BookViewer x:Name="MyDataDataView" Margin="0,0,0,0"></views:BookViewer>
    </Grid>
</Window>

Я написал эти коды, но я не вижу данных. Смотрите ниже:

alt text

Я добавил 2 фото моего режима отладки:

alt textalt text

Ответы [ 4 ]

6 голосов
/ 05 октября 2010

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

ItemsSource="{Binding}"

В классе списка нет свойства "MyData", это тип данных, который не нужно указывать в привязке, поскольку среда WPF будет использовать отражение для поиска всех свойств в MyData

2 голосов
/ 05 октября 2010

Вы назначаете список как DataContext, но привязка для ItemsSource в вашем списке просмотра ожидает свойство с именем MyData.

Либо вы задаете datacontext для модели представления и выставляете свойство MyData со списком или вы изменяете привязку ItemsSource просто на ItemsSource="{Binding}".

РЕДАКТИРОВАТЬ: Хорошо, после вашего последнего редактирования все еще кажется, что у вас есть несоответствие между именем свойства и привязкой.Вы связываетесь с MyData, но свойство называется myData.(обратите внимание на разницу в регистре)

0 голосов
/ 05 октября 2010

Вам необходимо привязать ItemsSource свойство вашего ListView к свойству вашей ViewModel

На данный момент вы привязываетесь к MyData, который, по-видимому, не является собственностью вашей ViewModel.

Вероятно, вам следует запустить метод GetData() в конструкторе вашей ViewModel, так как он выглядит так, чтобы заполнить список данными по умолчанию и создать свойство, подобное:

IEnumerable<MyData> MyDataList
{
    get{return myData;}
}

и установите ItemsSource из вас ListView на это.

Обновление

Вы выставили myData в качестве открытого поля в MyDataViewModel. Это не то же самое, что разоблачение собственности. Мой пример выше - это свойство (сейчас).

Кроме того, как говорит Роэл, вы должны использовать ObservableCollection<MyData>, а не List<MyData>, чтобы вы могли видеть любые изменения в вашей коллекции по мере их возникновения.

0 голосов
/ 05 октября 2010

Попробуйте использовать ObservableCollection<MyData> вместо обычного List<T>.Поскольку привязка происходит до того, как список заполнен, она не уведомляется об изменениях в списке.
ObservableCollection выдает уведомления привязке при добавлении элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...