![](/img/trans.png)
[英]ListView DataBindig using MVVM (WPF, ListView, Binding)
[英]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;
}
}
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>
我寫了這些代碼,但沒有我能看到的數據。看下面:
據我所知,您直接將項目列表分配為數據上下文,因此您的路徑應該是:
ItemsSource="{Binding}"
列表類中沒有屬性“MyData”,這是不需要在綁定中指定的數據類型,因為WPF框架將使用反射來搜索MyData上的所有屬性
您將列表指定為DataContext,但listview中ItemsSource的綁定需要名為MyData
的屬性。
您可以將datacontext設置為viewmodel並公開包含該列表的MyData屬性, 或者將ItemsSource綁定更改為ItemsSource="{Binding}"
。
編輯:好的,在您最近的編輯之后,似乎您的屬性名稱和綁定之間仍然不匹配。 綁定到MyData
但屬性名為myData
。 (注意案例差異)
嘗試使用ObservableCollection<MyData>
而不是常規List<T>
。 由於綁定發生在列表填充之前,因此不會通知列表中的更改。
添加項目時,ObservableCollection會向Binding發出通知。
您需要將ListView
的ItemsSource
屬性綁定到ViewModel的屬性
目前您綁定到MyData
,它似乎不是您的ViewModel的屬性。
您可能應該在ViewModel的構造函數中運行GetData()
方法,因為它似乎用默認數據填充列表,並創建一個屬性,如:
IEnumerable<MyData> MyDataList
{
get{return myData;}
}
並將ListView
的ItemsSource
設置為。
更新
您已將myData
公開為MyDataViewModel
的公共字段。 這與公開財產不同。 我上面的例子是一個屬性(現在)。
此外,正如Roel所說,您應該使用ObservableCollection<MyData>
而不是List<MyData>
這樣您就可以看到對集合的任何更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.