我正在嘗試用WPF構建我的第一個應用程式,為了充分理解MVVM,我沒有使用任何框架,我使用的唯一幫助程式是Microsoft.Toolkit.Mvvm。 我的應用程式有兩個頁面,一個是主頁面,另一個是細節頁面。 我已經按照WPF MVVM導航視圖中的解釋設定了導航。 現在我不明白我應該如何告訴詳細的螢屏它應該顯示哪些資料,因為我不允許向我在資料背景關系中實體化的viewmodel傳遞引數。
我的MainWindow.xaml
<Window x:Class="AlgsManagerDesktop.MainWindow"/span>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"/span>
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"。
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"。
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"。
xmlns:local="clr-namespace:AlgsManagerDesktop"
xmlns:views="clr-namespace:AlgsManagerDesktop. Views"。
xmlns:viewModel="clr-namespace:AlgsManagerDesktop.ViewModel"。
mc:Ignorable="d"。
Title="MainWindow" Height="450"/span> Width="800"/span>>
<Window.Resources>
<DataTemplate DataType="{x:Type viewModel:MasterViewModel}"/span>>
<views:MasterView />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:DetailsViewModel}"/span>>/span>
<views:DetailsView />
</DataTemplate>
</Window.Resources>/span>
<Window.DataContext>/span>
<viewModel:MainWindowViewModel />
</Window.DataContext>
<Grid>/span>
<ContentControl Content="{Binding ViewModel}" />
</Grid>
</Window>/span>
MainWindowViewModel.cs
public class MainWindowViewModel : ObservableObject >。
{
privateBaseViewModel viewModel。
public BaseViewModel ViewModel
{
get => viewModel;
set => SetProperty(ref viewModel, value) 。
}
public RelayCommand SwitchToDetailsCommand { get; }
public MainWindowViewModel()
{
ViewModel = new MasterViewModel()。
SwitchToDetailsCommand = new RelayCommand(SwitchToDetails)。
}
private void SwitchToDetails()
{
ViewModel = new DetailsViewModel()。
}
MasterViewModel.cs
public class MasterViewModel : BaseViewModel
{
private ItemModel selectedItem;
public ItemModel SelectedItem
{
get => selectedItem;
set
{
SetProperty(ref selectedItem, value) 。
DeleteCommand.NotifyCanExecuteChanged()。
}
}
public ObservableCollection<ItemModel> items { get; set; }
public RelayCommand DeleteCommand { get; }
public MasterViewModel()
{
DeleteCommand = new RelayCommand(RemoveItem, ItemIsSelected)。
}
private void RemoveItems()
{
AlgSets.Remove(SelectedItem)。
}
private bool ItemIsSelected()
{
return SelectedItem != null;
}
}
MasterView.xaml
<UserControl x:Class="AlgsManagerDesktop.Views.MasterView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"/span>
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"。
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"。
xmlns:local="clr-namespace:AlgsManagerDesktop. Views"
xmlns:viewModel="clr-namespace:AlgsManagerDesktop.ViewModel"。
xmlns:root="clr-namespace:AlgsManagerDesktop"
mc:Ignorable="d"。
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.DataContext>
<viewModel:MasterViewModel/>
</UserControl.DataContext>
<!--ListBox在此更新SelectedItem屬性-->
<!-- 這個按鈕處理導航到細節螢屏,我想把SelectedItem傳遞到下一個螢屏-->。
<Button Command="{Binding DataContext.SwitchToDetailsCommand,
RelativeSource={RelativeSource AncestorType={x:Type root:MainWindow}}。
Mode=OneWay}">
打開選定的
</Button>
</UserControl>
DetailsView.xaml
<UserControl x:Class="AlgsManagerDesktop.Views.DetailsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"/span>
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"。
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"。
xmlns:local="clr-namespace:AlgsManagerDesktop. Views"
xmlns:viewModel="clr-namespace:AlgsManagerDesktop.ViewModel"。
mc:Ignorable="d"。
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.DataContext>
<viewModel:DetailsViewModel/>
</UserControl.DataContext>
<-- 這里的專案細節,我想從DetailsViewModel的一個專案屬性中獲取-->。
</UserControl>
uj5u.com熱心網友回復:
DetailsView應該從MainWindowViewModel的ViewModel屬性中繼承DataContext,如果你從它那里洗掉下面的XAML標記,它就會繼承,也就是說,你不應該在某個地方明確設定UserControl的DataContext:
<UserControl.DataContext>
<viewModel:DetailsViewModel/>
</UserControl.DataContext>
然后由MainWindowViewModel來初始化和設定DetailsViewModel的狀態。
uj5u.com熱心網友回復:
你在MasterViewModel中創建了一個SelectedItem屬性,大概是為了系結到你的假定的ListBox的SelectedItem屬性,這在你的XAML中缺失,但這是一個死的視圖模型。事實上,我認為你不應該將你的視圖模型一分為三(實際的視圖模型、主視圖模型和細節模型),因為它們都是聯系在一起的--它們是一個視圖中的一個視圖和2個子視圖,所以從邏輯上講你應該有一個視圖模型。
很明顯,你的方法是行不通的,因為當你在代碼中創建主/細節視圖模型時,你根本沒有將它們聯系在一起,你只是創建了拋物線。
如果您出于某種原因想要保持您的 3 個視圖模型的獨立性,那么另一種方法是在兩個視圖模型中保持與主視圖模型的屬性鏈接,并將 SelectedItem 屬性移至主視圖模型,然后在兩個子視圖中系結它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312735.html
標籤:
