[英]WPF: יhow to populate my ViewModel in XAML instead of code behind
所以我有這個ViewModel
class
:
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Person> _persons;
public ObservableCollection<Person> Porsons
{
get { return _persons; }
set
{
_persons = value;
NotifyPropertyChanged();
}
}
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
然后創建這個ViewModel
class
並填充它的Person
列表:
ViewModel viewModel;
ObservableCollection<Person> persons
public MainWindow()
{
InitializeComponent();
viewModel = new ViewModel();
viewModel.Porsons= persons;
}
然后我的ListView
:
<ListView ItemSource={Binding Persons}/>
因此, ItemSource
將此Persons
列表綁定到我的ViewModel
class
,然后執行此ItemSource
我可以在純XAML
執行此操作,還是這是正確的方法?
建議不要在您的視圖上創建 ViewModel 屬性,而是建議使用它的DataContext(此鏈接還顯示了如何使用 XAML 設置它) 。 也不要在視圖中填充視圖模型,因為大多數時間數據駐留在模型中,並且視圖不應該知道任何模型的任何信息(在遵循 MVVM 時)。
請閱讀上面的鏈接並訪問您遇到的鏈接。 另請閱讀有關 MVVM 的這篇文章。 這為您提供了一些基礎知識,使您更容易理解如何使用 WPF 框架。
XAML 中有許多視圖模型創建的變體。 例如,您也可以在 App.Xaml 中創建它,以使其可通過StaticResource
標記擴展全局訪問,並通過Style
或使用ObjectDataProvider將其分配給各個控件的DataContext
。
此示例使用 XAML 屬性元素聲明直接在目標視圖中創建 ViewModel 實例。 此實例只能在本地訪問。
視圖模型.cs:
namespace Example
{
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
this.Persons = new ObservableCollection<Person>();
}
private ObservableCollection<Person> _persons;
public ObservableCollection<Person> Persons
{
get => _persons;
set
{
_persons = value;
NotifyPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
查看.xaml:
<Window x:Class="Example.MainWindow"
...
xmlns:local="clr-namespace:Example">
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<Grid>
<ListView ItemSource={Binding Persons}/>
</Grid>
</Window>
是的你可以。 但不,你肯定不想。
要回答您的問題,假設您的 Person 類如下所示:
public class Person
{
public string Name { get; set; }
}
您可以輕松地在 XAML 中聲明一個列表並將其綁定到 ListView(例如),如下所示:
<ListView DisplayMemberPath="Name">
<ListView.ItemsSource>
<x:Array Type="{x:Type vm:Person}">
<vm:Person Name="Tom" />
<vm:Person Name="Dick" />
<vm:Person Name="Harry" />
</x:Array>
</ListView.ItemsSource>
</ListView>
結果是這樣的:
但是,僅僅因為您可以這樣做,並不意味着您應該這樣做。 MVVM 的重點是將視圖層與視圖模型層分開。 您應該能夠從測試構建運行整個應用程序,而根本不需要創建單個視圖對象。 在問這個問題時,您顯然試圖做的是在您的視圖層中聲明一個數據結構,這是完全錯誤的放置位置。 你的視圖層應該盡可能的“愚蠢”,只有最弱的綁定到你的視圖模型層,在那里實際的邏輯正在發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.