在我的应用程序中,我有一个包含MainPageView作为内容控件的MainWindow。此MainPageView具有用户搜索选项,搜索结果显示在此MainPageView用户控件上。搜索结果最初显示为2列样式。用户可以通过单击"详细信息"选择查看特定结果的详细信息。搜索结果上的按钮(每个搜索结果也是具有描述文本块,超链接等的用户控件。)。
因此,当单击“详细信息”按钮时,上面的MainPageView结果区域将变为单列,第二列用于显示详细信息。我创建了一个可以显示详细信息的UserControl。我可以通过在代码后面设置属性来显示此对话框用户控件。但是如何通过MVVM设置Details用户控件的属性?
这是用于填充结果的XAML
<ContentControl>
<ItemsControl ItemsSource="{Binding TemplatesVM}" Width="{Binding GridWidth}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="{Binding NumColumns}"></UniformGrid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<v:TemplateView Content="{Binding }"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ContentControl>
这是TemplateVM集合
private Collection<TemplatesViewModel> _templatesVM;
public Collection<TemplatesViewModel> TemplatesVM { get { return _templatesVM; } set { _templatesVM = value; NotifyOfPropertyChange(() => TemplatesVM); } }
现在,当在特定搜索结果上按下详细信息按钮时,如何在DetailsView的ViewModel中填充属性?以下是在mainPageView中显示DetailsView的xaml
<v:DetailsView ></v:DetailsView>
这是DetailsViewModel对象的属性,它包含要显示的所有信息。
public DetailsViewModel DetailsManager { get; set;}
非常感谢任何有用的评论/答案。谢谢!
答案 0 :(得分:1)
根据您的意见,答案很简单。
只需像这样绑定视图的数据上下文
<v:DetailsView DataContext={Binding DetailsManager}></v:DetailsView>
它应该有用。
答案 1 :(得分:0)
这是你的viewmodel?你也需要它,但你也需要一个视图,这是你想要绑定的视图,除非你在某些情况下做我喜欢做的事情。无论如何,你将不得不实现INotifyPropertyChanged接口来发信号通知属性已经改变的gui。
private DetailsViewModel detailsManager;
public DetailsViewModel DetailsManager
{
get { return detailsManager; }
set
{
if (Equals(value, detailsManager)) return;
detailsManager = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator] // Comment out if no R#
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
修改强> 我在那里读错了我认为你的收藏是在parent itemsource中设置的,所以你可以在上面实现你的属性,就像&#34; SelectedItem&#34;例如。但问题!在itemscontrol中显示的项目,在你的情况下是一个带有TemplateVM的oc(我们不知道这是什么),datacontext将被设置为datatemplate列表中的项目。
无论如何xaml:
<.Resources>
<local:YourDetailViewConverter x:Key="YourDetailViewConverter"/>
<DataTemplate DataType="{x:Type local:DetailManager}">
<local:DetailsView
DataContext="{Binding Path=.,Converter={StaticResource YourDetailViewConverter}}"/>
</DataTemplate>
</.Resources>
<ContentControl>
<ItemsControl ItemsSource="{Binding TemplatesVM}" SelectedItem="{Binding DetailsManager}" Width="{Binding GridWidth}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="{Binding NumColumns}"></UniformGrid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ContentControl>
您需要创建一个IValueConverter,将您的detailviewmodel转换为实际视图。如果您有不同的详细视图,这可能很方便。
希望有所帮助
干杯
了Stian