从MainPageViewModel设置用户控件的属性

时间:2014-08-19 12:53:26

标签: c# wpf xaml

在我的应用程序中,我有一个包含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;}

非常感谢任何有用的评论/答案。谢谢!

2 个答案:

答案 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