多绑定转换器?

3
我正在尝试编写一个多绑定转换器,用于导航模型,在两个列表框中选择任何一个列表框项时,将页面加载到框架中。同时,我需要能够从导航类使用前进/后退按钮进行导航,并能够显示列表框项的选定状态,如果其UriSource已加载到框架中。我拥有的转换器可以从框架中的两个源-列表框更新urisources,但无法切换列表框项的选定状态。我在转换器的ConvertBack部分中将列表框项切换为选定状态。我做错了什么,我总是在构建过程中出现错误。请告诉我是否可以实现我正在尝试做的事情。谢谢您提前。

下面是MultiBindConverter代码:
 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)
    { 
        if (value != null)
        {
            var uri = (Uri)value;
            var uriString = uri.OriginalString;

            if (uri.OriginalString.Contains(";component/"))
            {
                uriString = uriString.Substring(uriString.IndexOf("/") + 1);
            }
            return new object[] { uriString, uriString };  
       }
   } 
} 

XAML:

<Frame Grid.Column="2" x:Name="ContentFrame" JournalOwnership="OwnsJournal" NavigationUIVisibility="Visible"> 
        <Frame.Source> 
            <MultiBinding Converter="{StaticResource MultiBindConverter}"> 
                <Binding Path="SelectedValue" ElementName="Nav_ListBox"/> 
                <Binding Path="SelectedValue" ElementName="SublevelListbox"/> 
            </MultiBinding> 
        </Frame.Source> 
    </Frame>
1个回答

2

您没有实现IMultiValueConverter接口。ConvertBack的签名为:

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)

这与Convert相反,Convert接受一个数组并输出单个值,因此它需要接收单个值并输出值数组。在这种情况下,ConvertBack的传入值将是Frame.Source,输出将是两个SelectedValue属性。


感谢您查看我的帖子。我在正确地处理它方面遇到了困难。我想知道您是否有机会展示一下代码行中的实现方式。我已经尝试了很长时间,但仍然卡在这里。 - vladc77
要将值返回给SelectedValue属性,您需要从ConvertBack返回一个由两个元素组成的数组,并按照绑定的顺序提供值。如果您希望两个值相同,可以这样做:return new object[] { uriString, uriString }; 您还需要在绑定上设置Mode="TwoWay"。 - John Bowen
我尝试过了,但好像做错了什么。不知道您是否介意向我展示一下完整的代码。我已更改转换器并将其更新到上面,但仍无法正常工作。我需要获取与任何列表框项相关联的值,这对我来说有点棘手。感谢您查看我的帖子,非常感激。 - vladc77
你当前的代码如果value==null时没有返回任何内容。就像其他带有返回类型的C#方法一样,所有路径都需要返回某些内容。 - John Bowen
我对这个转换器进行了许多修订。它是我卡住的东西。我无法使它工作。看起来 ConvertBack 方法从未被调用。我只是想知道您是否知道在一个转换器中实现我计划做的事情是否可能。 - vladc77
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接