簡體   English   中英

如何在wpf中通過MVVM使用ListView綁定獲取數據?

[英]How to get data using ListView Binding via MVVM in wpf?

我嘗試使用Silverlight ListView使用生成MVVM模式。 但如果我綁定數據我的silverlight控件沒有數據可視化。 也沒有錯誤返回。 我看到空的gridview。

模型:

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>

視圖模型:

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>

我寫了這些代碼,但沒有我能看到的數據。看下面:

替代文字

我添加了2個圖片我的調試模式:

替代文字替代文字

據我所知,您直接將項目列表分配為數據上下文,因此您的路徑應該是:

ItemsSource="{Binding}"

列表類中沒有屬性“MyData”,這是不需要在綁定中指定的數據類型,因為WPF框架將使用反射來搜索MyData上的所有屬性

您將列表指定為DataContext,但listview中ItemsSource的綁定需要名為MyData的屬性。

您可以將datacontext設置為viewmodel並公開包含該列表的MyData屬性, 或者將ItemsSource綁定更改為ItemsSource="{Binding}"

編輯:好的,在您最近的編輯之后,似乎您的屬性名稱和綁定之間仍然不匹配。 綁定到MyData但屬性名為myData (注意案例差異)

嘗試使用ObservableCollection<MyData>而不是常規List<T> 由於綁定發生在列表填充之前,因此不會通知列表中的更改。
添加項目時,ObservableCollection會向Binding發出通知。

您需要將ListViewItemsSource屬性綁定到ViewModel的屬性

目前您綁定到MyData ,它似乎不是您的ViewModel的屬性。

您可能應該在ViewModel的構造函數中運行GetData()方法,因為它似乎用默認數據填充列表,並創建一個屬性,如:

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

並將ListViewItemsSource設置為。

更新

您已將myData公開為MyDataViewModel的公共字段。 這與公開財產不同。 我上面的例子是一個屬性(現在)。

此外,正如Roel所說,您應該使用ObservableCollection<MyData>而不是List<MyData>這樣您就可以看到對集合的任何更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM