从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;}

任何有用的意见/答案将不胜感激。谢谢! !

从MainPageViewModel设置用户控件的属性

根据你的评论,答案很简单。

像这样绑定视图的数据上下文

<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