WPF绑定到具有哈希键作为索引的可观察集合

问题描述 投票:0回答:1

以下代码:

    <UserControl x:Class="MyProgram.Views.MyControlContainer"
             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:MyProgram.Views"
             xmlns:common_model="clr-namespace:MyProgram.Models;assembly=CommonTitan"
             mc:Ignorable="d" 
            >
    <Grid Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <local:MyControl x:Name="MyControl1" DataContext="{Binding MyControlCollection[8]}" Grid.Row="0" Grid.Column="0"/>
        <local:MyControl x:Name="MyControl2" DataContext="{Binding MyControlCollection[9]}" Grid.Row="0" Grid.Column="1"/>
        <local:MyControl x:Name="MyControl3" DataContext="{Binding MyControlCollection[10]}" Grid.Row="0" Grid.Column="2"/>                   
    </Grid>
</UserControl>

(据我所知)适当地将我绑定到我在集合中指定的项目。在实际使用中,它将使用一个可观察的字典,并且那些索引是我无法输入代码的哈希值。是否可以将2个已知参数传递给某种转换器以获取哈希?或什至将2个值传递给转换器,最终将其从可观察词典中返回?]

wpf data-binding observablecollection
1个回答
1
投票

例如,您可以传递2个已知值作为转换器参数:

<local:MyControl x:Name="MyControl1" DataContext="{Binding MyControlCollection, Converter={StaticResource CollectionConverter}, ConverterParameters='8'}" />

并且在转换器类中,您可以在这里使用它,将参数解析为字符串:

public class CollectionConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter != null)
        {
            int param = int.Parse(parameter as string);
            if (param == 8)
               return (value as ObservableCollection)[param];
            else
               return (value as ObservableCollection)[0];
        }
        return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new InvalidOperationException("cannot cast the value");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.