从列表构建导航以生成页面

时间:2016-12-16 11:53:00

标签: c# wpf listview

我正在尝试制作一个wpf桌面应用程序。我想制作一个分成两半的窗口。左侧应包含列表(如导航),右侧应包含页面。每次我点击列表中的项目,我都想加载一个新页面。该页面包含TreeView。目前我有一个类TreeViewData,其中包含TreeView的数据。这些存储在List中。在我的Main我做

foreach(var t in TreeViewDataList)
{
    TreeViewDataWindow w2 = new TreeViewDataWindow(t);
    w2.Show();
}

显示TreeViews。但是有20个打开的窗户真的是用户不友好。有人能给我一个如何实现这种行为的提示吗?

1 个答案:

答案 0 :(得分:1)

我猜你定义了ViewModel和Views,所以我提出了解决方案,而不是TreeView我使用ListBox, 在MainWindow,

  <Grid>
        <Grid.Resources>
            <DataTemplate DataType="{x:Type my:AdvancedViewModel}">
                <view:AdvancedView/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type my:RegularViewModel}">
                <view:RegularView/>
            </DataTemplate>
        </Grid.Resources>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding ViewModels}" SelectedItem="{Binding SelectedViewModel}" Grid.Column="0"/>
        <ContentControl Content="{Binding SelectedViewModel}" Grid.Column="1"/>
    </Grid>

我在这里使用了一些视图和视图模型,例如

你的意见, 第一视图

<UserControl x:Class="WpfApplication5.RegularView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:WpfApplication5"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBlock Text="Fom Regular"/>
</Grid>

第二种观点

<UserControl x:Class="WpfApplication5.AdvancedView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:WpfApplication5"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBlock Text="From Advanced"/>
</Grid>

你和MainViewModel一样,

public class MainViewModel
{
    private ObservableCollection<ViewModelBase> viewModels;

    public ObservableCollection<ViewModelBase> ViewModels
    {
        get { return viewModels; }
        set { viewModels = value; }
    }

    private ViewModelBase selectedViewModel;

    public ViewModelBase SelectedViewModel
    {
        get { return selectedViewModel; }
        set { selectedViewModel = value; }
    }
    public MainViewModel()
    {
        ViewModels = new ObservableCollection<ViewModelBase>();
        ViewModels.Add(new RegularViewModel());
        ViewModels.Add(new AdvancedViewModel());
        SelectedViewModel = ViewModels[0];
    }

}

public class ViewModelBase
{
}
public class RegularViewModel : ViewModelBase
{

}
public class AdvancedViewModel : ViewModelBase
{

}