2012-10-02 35 views
5

Soy una aplicación y me gustaría vincular algunos cuadros de texto y chekcboxes al campo de valor del diccionario (Enum, cadena). ¿Es esto posible y cómo puedo hacer eso?vinculando al valor en el diccionario con enum como clave

En el código XAML tengo algo como esto - que está trabajando para Dictionary con cadena como una llave, pero no puede unirse correctamente a llave con enumeración

<dxe:TextEdit EditValue="{Binding Properties[PrimaryAddress], Mode=TwoWay}" /> 
<dxe:TextEdit EditValue="{Binding Properties[SecondaryAddress], Mode=TwoWay}" /> 
<dxe:CheckEdit EditValue="{Binding Properties[UsePrimaryAddress], Mode=TwoWay}" /> 

.. y esto es lo que tengo en Enum

public enum MyEnum 
{ 
    PrimaryAddress, 
    SecondaryAddress, 
    UsePrimaryAddress 
} 

En el diccionario se define como modelo de vista:

public Dictionary<MyEnum, string> Properties 

he encontrado solut ion para combobox con valores enum, pero esto no se aplica a mi caso.

¿Algún consejo?

Respuesta

9

Debe establecer el tipo apropiado para el parámetro del indexador en la expresión de enlace.

Ver modelo:

public enum Property 
{ 
    PrimaryAddress, 
    SecondaryAddress, 
    UsePrimaryAddress 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Properties = new Dictionary<Property, object> 
     { 
      { Property.PrimaryAddress, "123" }, 
      { Property.SecondaryAddress, "456" }, 
      { Property.UsePrimaryAddress, true } 
     }; 
    } 

    public Dictionary<Property, object> Properties { get; private set; } 
} 

XAML:

<Window x:Class="WpfApplication5.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication5" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <TextBox Grid.Row="0" Text="{Binding Path=Properties[(local:Property)PrimaryAddress]}"/> 
     <TextBox Grid.Row="1" Text="{Binding Path=Properties[(local:Property)SecondaryAddress]}"/> 
     <CheckBox Grid.Row="2" IsChecked="{Binding Path=Properties[(local:Property)UsePrimaryAddress]}"/> 
    </Grid> 
</Window> 

de código subyacente:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel(); 
    } 
} 

Para obtener más información, consulte "Binding Path Syntax".

+0

Usando la ruta de enlace anterior obtuve el siguiente error: System.Windows.Data Error: 40: Error de ruta BindingExpression: la propiedad '[]' no se encuentra en 'object' '' Dictionary'2 '(HashCode = 56465364)'. BindingExpression: Path = Properties [(mbpt: MyEnum) UsePrimaryAddress]; DataItem = 'MyUserControlViewModel' (HashCode = 21018822); el elemento objetivo es 'CheckEdit' (Name = ''); target property es 'EditValue' (escribe 'Object') – user1714232

+0

Uh, no importa. Cometí un error en el camino de enlace. Tu solución está funcionando ahora. Gracias :) – user1714232

Cuestiones relacionadas