我对 WPF MVVM (Light) 很陌生,我需要一些帮助。
我所拥有的是一个主细节场景,主视图中的 TabControl,第一个选项卡中的主视图(ProductsView)和以下选项卡中的多个不同的详细信息视图(例如 DetailsView)。
根据 ProductsView 中选择的项目(SelectedProduct),我想在 DetailsView 中获取项目,但不是立即获取 - 仅当用户单击包含此详细信息视图的 tabitem 时。
因此,从数据库中获取详细数据应该以某种方式推迟到用户单击适当的详细信息选项卡时(他可能根本不会单击它)。
这是我的xml:
<!-- Main View -->
<UserControl x:Class="MyApp.Views.MainView">
<TabControl>
<TabControl.Items>
<TabItem>
<views:ProductsView />
</TabItem>
<TabItem>
<views:DetailsView />
</TabItem>
<!-- More TabItems with details views -->
</TabControl.Items>
</TabControl>
</UserControl>
<!-- Products View -->
<UserControl x:Class="MyApp.Views.ProductsView">
<Grid DataContext="{Binding Source={StaticResource Locator}, Path=ProductsVM}">
<DataGrid ItemsSource="{Binding Products}" SelectedItem="{Binding SelectedProduct}">
<DataGridTextColumn Binding="{Binding Path=Model.ProductID}" Header="Product ID" />
</DataGrid>
</Grid>
</UserControl>
<!-- Details View -->
<UserControl x:Class="MyApp.Views.DetailsView">
<Grid DataContext="{Binding Source={StaticResource Locator}, Path=DetailsVM.Details}">
<StackPanel>
<TextBox Text="{Binding Path=Model.Field1}" />
<TextBox Text="{Binding Path=Model.Field2}" />
</StackPanel>
</Grid>
</UserControl>
和代码:
public class ProductsViewModel : ViewModelBase
{
private ObservableCollection<Product> products;
public ObservableCollection<Product> Products
{
get
{
return products;
}
set
{ // RaisePropertyChanged
Set("Products", ref products, value);
}
}
private Product selectedProduct;
public Product SelectedProduct
{
get
{
return selectedProduct;
}
set
{ // RaisePropertyChanged and broadcast message of type PropertyChangedMessage<Product>
Set("SelectedProduct", ref selectedProduct, value, true);
}
}
public ProductsViewModel(IDataService dataService)
{
this.dataService = dataService;
Products = dataService.GetAllProducts();
}
}
public class DetailsViewModel : ViewModelBase
{
private Details details;
public Details Details
{
get
{
return details;
}
set
{ // RaisePropertyChanged
Set("Details", ref details, value);
}
}
public DetailsViewModel(IDataService dataService)
{
this.dataService = dataService;
Messenger.Default.Register<PropertyChangedMessage<Product>>(this, m => Details = dataService.GetDetails(m.NewValue.Model.ProductID));
}
}
现在这可行,但在选择产品后,所有详细信息都会立即在所有详细信息选项卡中获取。我一直在想,也许当用户单击 MainView 中的选项卡时,MainViewModel 应该向 ProductviewModel 发送带有选项卡索引的消息,然后 ProductviewModel 应该根据选项卡索引向当前请求的 tabitem 的 DetailsViewModel 发送另一条消息,这将更新它的详细数据。
但是我如何根据标签索引仅向当前请求的 tabitem/DetailsView 发送消息,而不是全部发送消息?
而且这种往返听起来太复杂了。你能给我一些建议吗?或者这是完全错误的?也许还有另一种更简单、更优雅的解决方案?