簡體   English   中英

WPF:如何在 XAML 中填充我的 ViewModel 而不是背后的代碼

[英]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.

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