我希望找到一个关于如何实现我想要的功能的答案。我有两个列表框。我从XML生成内容。我还用XML定义了UriSources。我想了解如何通过单击任何列表框中的任何列表框项来实现导航。因此,我需要能够从两个不同的lisbox更新Frame的Source属性。 Perphaps,它应该与一些转换器多绑定。任何想法都受到高度赞赏。
XAML: 列表框和框架:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="TwoListboxes_2.MainWindow"
xmlns:local="clr-namespace:TwoListboxes_2"
Title="MainWindow"
Width="1000" Height="700">
<Window.Resources>
<local:UriConverter x:Key="UriConverter" />
<XmlDataProvider x:Key="PageData" Source="Data/data.xml" XPath="/Pages" />
<DataTemplate x:Key="SublevelListboxDataTemplate">
<Grid>
<TextBlock Text="{Binding XPath=@name}"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="MainListBoxDataTemplate">
<TextBlock Text="{Binding XPath=@name}"/>
</DataTemplate>
</Window.Resources>
<Grid HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="215"/>
<ColumnDefinition Width="1"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid >
<ListBox x:Name="SublevelListbox" Width="80"
DataContext="{Binding SelectedItem, ElementName=Nav_ListBox}"
ItemTemplate="{DynamicResource SublevelListboxDataTemplate}"
ItemsSource="{Binding XPath=./*}"
/>
<Border HorizontalAlignment="Left">
<ListBox x:Name="Nav_ListBox"
ItemTemplate="{DynamicResource MainListBoxDataTemplate}"
ItemsSource="{Binding Source={StaticResource PageData}, XPath=page}"
SelectedValuePath="@UriSource"
SelectedIndex="0"
/>
</Border>
</Grid>
<Frame Grid.Column="2" x:Name="ContentFrame" JournalOwnership="OwnsJournal" NavigationUIVisibility="Visible"
Source="{Binding SelectedValue, Converter={StaticResource UriConverter}, ElementName=Nav_ListBox, Mode=TwoWay}"
/>
</Grid>
XML:
<?xml version="1.0" encoding="utf-8"?><Pages xmlns="">
<page name="Name 1" UriSource="Pages/Name1.xaml" />
<page name="Name 2" UriSource="Pages/Name2.xaml" >
<level2 name="ALL1" UriSource="Pages/All1.xaml" />
<level2 name="ALL2" UriSource="Pages/All2.xaml" />
<level2 name="ALL3" UriSource="Pages/All3.xaml" />
<level2 name="ALL4" UriSource="Pages/All4.xaml" />
</page>
<page name="Name 3" UriSource="Pages/Name3.xaml"/>
<page name="Name 4" UriSource="Pages/Name4.xaml" IsEnabled="True" />
当UriSource加载到Frame中时,UriConverter将alllo listboxitems置于选中状态:
public class MultiBindConverter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values[0] != null)
{
if (values[1] != null)
{
return new Uri(values[1].ToString(), UriKind.RelativeOrAbsolute);
}
return new Uri(values[0].ToString(), UriKind.RelativeOrAbsolute);
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
//throw new NotImplementedException();
var uri = (Uri)value;
var uriString = uri.OriginalString;
if (value != null)
{
if (uri.OriginalString.Contains(";component/"))
{
uriString = uriString.Substring(uriString.IndexOf("/") + 1);
}
}
return new object[] { uriString, uriString[0], uriString[1] };
}
#endregion IMultiValueConverter Members
}
Thank you in advance.
答案 0 :(得分:1)
我认为设计是你需要将主列表绑定到一个列表框,详细列表(子列表)绑定第二个列表。结构,即您的数据模型应该是,
大师 - 详细信息 - 选择的详细信息视图
并将选定的详细信息视图绑定到框架。
答案 1 :(得分:1)
如果我正确理解你能够正确绑定两个列表框,唯一的问题是绑定帧与两个不同的源。 您的猜测是正确的,您可以使用Multibinding实现此目的。我假设第二个列表框没有默认选择。
xaml中的多重绑定将是这样的
<Frame Grid.Column="2" x:Name="ContentFrame" JournalOwnership="OwnsJournal" NavigationUIVisibility="Visible">
<Frame.Source>
<MultiBinding Converter="{StaticResource conv}">
<Binding Path="SelectedItem" ElementName="Nav_ListBox"/>
<Binding Path="SelectedItem" ElementName="SublevelListbox"/>
</MultiBinding>
</Frame.Source>
</Frame>
您的转换器将
public class MultiBindConverter : IMultiValueConverter {
#region IMultiValueConverter Members
public object Convert (object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (values[0] != null) {
if (values[1] != null) {
return new Uri (values[1].ToString (), UriKind.RelativeOrAbsolute);
}
return new Uri (values[0].ToString (), UriKind.RelativeOrAbsolute);
}
return null;
}
public object[] ConvertBack (object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException ();
}
#endregion IMultiValueConverter Members
}
答案 2 :(得分:0)
是的,我试过了,这不起作用。您可能需要在数据类中保留一个属性,通过该属性可以绑定框架源和列表框项的selectedValue。