我對WPF MVVM(Light)非常陌生,我需要一些幫助。WPF MVVM Light TabControl中的主控細節,使用消息傳遞所選項目
什麼我是主從方案中,TabControl的在主視圖中,在第一個選項卡主視圖(ProductsView),並在以下選項卡的多個不同的細節視圖(例如的DetailsView)。
根據在ProductsView選擇(SelectedProduct)的項目,我想立即獲取在DetailsView項目,但沒有 - 只有當用戶點擊包含此信息查看TabItem的。從數據庫
所以取詳細數據應當用戶點擊相應的詳細資料標籤以某種方式推遲到一點(他可能不點擊它在所有)。
這裏是我的XAML:
<!-- 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應該發送一個帶有Tab鍵索引的消息給ProductviewModel,然後ProductviewModel應該發送另一個消息將SelectedProduct傳遞給基於tab索引的當前請求tabitem的DetailsViewModel,會更新它的詳細數據。
但我怎麼會只發送消息到當前請求的tabitem/DetailsView基於標籤索引,而不是所有的?
而且這種往返方式聽起來太複雜了。你能給我一些建議嗎? 或者這是完全錯誤的? 也許有另一個更簡單更優雅的解決方案呢?