从MainPageViewModel设置用户控件的属性
本文关键字:属性 控件 用户 MainPageViewModel 设置 | 更新日期: 2023-09-27 18:18:51
在我的应用程序中,我有一个MainWindow,包含MainPageView作为内容控件。这个MainPageView有一个用户搜索选项,搜索结果显示在这个MainPageView用户控件上。搜索结果最初以2列样式显示。用户可以通过点击搜索结果上的"详细信息"按钮来选择查看特定结果的详细信息(每个搜索结果也是一个用户控件,具有描述文本块,超链接等)。
因此,当点击Details按钮时,上面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); } }
现在当Details按钮按下一个特定的搜索结果,我如何填充DetailsView的ViewModel属性?这是在mainPageView中显示DetailsView的示例
<v:DetailsView ></v:DetailsView>
,这里是DetailsViewModel对象的属性,它携带所有要显示的信息。
public DetailsViewModel DetailsManager { get; set;}
任何有用的意见/答案将不胜感激。谢谢! !
根据你的评论,答案很简单。
像这样绑定视图的数据上下文
<v:DetailsView DataContext={Binding DetailsManager}></v:DetailsView>
这是你的视图模型吗?你也需要那个,但你还需要一个视图,这是你想绑定的,除非你做我喜欢做的事情。无论如何,您必须实现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));
}
编辑:我读错了,我认为你的集合是在父母itemssource中设置的,所以你可以像"SelectedItem"一样实现你的属性。但问题!在itemscontrol中显示的项,在您的例子中是一个带有TemplateVM的oc(我们不知道这是什么),数据上下文将被设置为数据模板中列表中的项。
不管怎样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来将你的detailviewmodels转换成它们的实际视图。如果你有不同的细节视图,这很方便。
希望有帮助
欢呼Stian