我是MVVM的新手。我有一个主项目“MVVM演示”,其中包括mainwindow.xaml文件,它有我的主UI。我有一个列表框,其中包含一组项目:
<ListBox Name="ButtonPanel" ItemsSource="{Binding BoardTabs}" SelectedItem="{Binding SelectedTab, Mode=TwoWay}" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Connect}" >
</TextBlock>
<TextBlock Text="{Binding I2C}" >
</TextBlock>
<TextBlock Text="{Binding Voltage}" >
</TextBlock>
<TextBlock Text="{Binding Clock}" >
</TextBlock>
<TextBlock Text="{Binding Codec}" >
</TextBlock>
<TextBlock Text="{Binding EEPROM}" >
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我需要列表框的每个项目分别打开一个新的用户控件。请注意,我在主项目(我的解决方案文件中的第二个项目)之外创建了一个单独的用户控件,并将其添加为主项目(Board control mvvm)的参考
电压是userControl之一,它有一个voltage.xaml文件,我的Ui所在的文件有一个单独的视图,模型和视图模型类。当我点击位于Board Control MVVM项目中的MainWindow.xaml中的电压项(列表框内的文本块)时,它会弹出一个新窗口。
这是我的ProductView Model Class,它从mainwindow.xaml UI中选择选项卡:
private Product m_SelectedTab;
public Product SelectedTab
{
get
{
return m_SelectedTab;
}
set
{
m_SelectedTab = value;
NotifyPropertyChanged("SelectedTab");
}
}
我想知道当我在Listbox(mainwindow.xaml)中选择项目时,会弹出一个窗口shud,上面是voltage.xaml UI。如果你需要任何进一步的代码来清楚描述,我很乐意上传到这里。
请帮助:(
答案 0 :(得分:0)
要清楚;如果ConnectBox,I2C,Voltage等是ListBox中你想要的项目,那么上面的Xaml就不是你想要的。因为每个项目都包含所有这些TextBlocks(因为你将ItemTemplate定义为几个TextBlocks)。
相反,我假设你想要的是每个项目(Connect,I2C等)都是ListBox的项目。再假设您要做的唯一事情是打开另一个页面然后您可以在每个ListBoxItem中使用HyperlinkButton:
<ListBox x:Name="ListBoxItems" ItemsSource="{Binding Path=Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<HyperlinkButton NavigateUri="{Binding Path=Page}">
<HyperlinkButton.Style>
<Style TargetType="HyperlinkButton">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="HyperlinkButton">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</HyperlinkButton.Style>
<TextBlock Text="{Binding Path=Name}" />
</HyperlinkButton>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
此处Name和Page是Item类的属性,它表示每个项目(Connect,I2C等),Name为Name(Voltage),Page为Uri,指向您要打开的相应页面( /Voltage.xaml)
ListBox的ItemsSource绑定到ViewModel类的Items属性,Items是ObservableCollection的Item对象:
ItemsViewModel viewModel = new ItemsViewModel() {
Items = new ObservableCollection<Item>() {
new Item() { Name = "Item 1", Page = new Uri("/Page1.xaml", UriKind.Relative) },
new Item() { Name = "Item 2", Page = new Uri("/Page2.xaml", UriKind.Relative) }}
};
请注意,如果您想将额外数据传递给Page,您可以通过查询字符串(/Voltage.xaml?param=blah)执行此操作,或者您可以为每个项添加一个命令并自行处理导航。 / p>