Decir que tengo algunos bloques de texto en mi interfaz de usuario, algo así:

<StackPanel Orientation="Vertical">
    <TextBlock Text="{Binding DessertIndex}" />
    <TextBlock Text="{Binding Food[2]}" />
    <TextBlock Text="{Binding Food[{Binding DessertIndex}]}" />
</StackPanel>

y en mi código detrás tengo algo como esto:

public partial class MainWindow : Window
{
    public int DessertIndex
    {
        get { return 2; }
    }

    public object[] Food
    {
        get
        {
            return new object[]{"liver", "spam", "cake", "garlic" };
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }
}

Los dos primeros bloques de texto de la pantalla muy bien para mí, la visualización de 2 y ‘pastel’, respectivamente. El tercero no lograr lo que me gustaría, a saber, el uso de la DessertIndex propiedad de índice en la matriz y también mostrar ‘pastel’. Me hizo buscar un poco de aquí, ASÍ que para una pregunta similar, pero no encontraron a uno. En última instancia, no quiero especificar valores como el 2 en mi .archivo xaml y le gustaría contar con una propiedad en lugar de la indización en la matriz. Es esto posible? Si es así, ¿qué estoy haciendo mal aquí?


EDICIÓN:

Así que lo que más cerca tenemos es una situación en la que los datos se muestra una Lista de estos object[] y estoy usando el de arriba StackPanel como parte de una plantilla de datos de un ListBox. Así que la idea, como Marca de Salud sugiere a continuación, de uso de una propiedad que elimina referencias a la matriz parece que no funciona como me gustaría. Ideas?

InformationsquelleAutor itsmatt | 2010-11-04

2 Comentarios

  1. 29

    Otra alternativa es el uso de MultiBinding con un convertidor de:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication1"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel Orientation="Vertical">
            <StackPanel.Resources>
                <local:FoodIndexConverter x:Key="foodIndexConverter" />
            </StackPanel.Resources>
            <TextBlock Text="{Binding DessertIndex}" />
            <TextBlock Text="{Binding Food[2]}" />
            <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource foodIndexConverter}">
                            <Binding Path="DessertIndex" />
                            <Binding Path="Food"/>
                        </MultiBinding>
                    </TextBlock.Text>
            </TextBlock>
        </StackPanel>
    </Window>

    A continuación, en el código-detrás, el convertidor se define algo como esto:

    namespace WpfApplication1
    {
        public class FoodIndexConverter : IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (values == null || values.Length != 2)
                    return null;
    
                int? idx = values[0] as int?;
                object[] food = values[1] as object[];
    
                if (!idx.HasValue || food == null)
                    return null;
    
                return food[idx.Value];
            }
    
            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }
    • Gracias Colin – esto funciona muy bien para mi examen de la aplicación y la sospecha de que va a funcionar igual de bien en la cosa real. Ha sido un buen día – me enteré de algo realmente bueno de usted. 🙂
    • Usted puede estar tentado a probar algo diferente utilizando un ConverterParameter para evitar la multibinding. Por desgracia, que los llevará a ninguna parte, como la ConverterParameter puede utilizar un enlace de como no es un DependencyProperty, y debe utilizar MultiBinding
  2. 13

    si van a la molestia de tener un DesertIndex propiedad en su DataContext, ¿por qué no una propiedad que elimina referencias a la Comida de la matriz con DesertIndex:

    public object SelectedFood
    {
        get { return Food[DessertIndex]; }
    }    
    
    public int DessertIndex
    {
        get { return 2; }
    }
    
    public object[] Food
    {
        get
        {
            return new object[]{"liver", "spam", "cake", "garlic" };
        }
    }

    a continuación, puede enlazar directamente a que:

    <TextBlock Text="{Binding SelectedFood}" />

    Este es esencialmente el «MVVM» enfoque: hacer el datacontext de objetos tienen propiedades que están apenas a la derecha para la unión.

    • Marcos, gracias por tu respuesta. Véase mi edición a la pregunta original para más detalles. Básicamente me estoy tratando con un ListBox y un Listado de estas object[]’s así que no sé cómo hacer que la eliminación de referencias como usted sugiere trabajar en este contexto. Los datos no es la mía y tengo que lidiar con ella tal y como es. Ideas?
    • sí, lo hice pregunto si eso podría ser el caso.

Dejar respuesta

Please enter your comment!
Please enter your name here