2011-03-25 13 views
6

Estoy trabajando con una aplicación WPF, y estoy trabajando en un DataGrid que incorpora el uso de contenido dinámico que debe reaccionar ante eventos, etc.Enlazar entradas a DataGrid ComboBox View

Tengo el siguiente modelo de vista para la vista que contiene la cuadrícula de datos

public class HiddenFieldPanelViewModel 
{ 
    public List<HiddenFieldComponent> HiddenFieldList { get; set; } 
    public HiddenFieldComponent Component { get; set; } 
    public bool IsVisible { get; set; } 
    public enum FieldTypes{Constant,Variable} 
    public HiddenFieldPanelViewModel() 
    { 
     HiddenFieldList = new List<HiddenFieldComponent>(); 
     IsVisible = false; 
    } 
} 

La única propiedad en este modelo que se aplica a este ejemplo es la siguiente propiedad de enumeración

public enum FieldTypes {Constant,Variable} 

Lo que necesito cuando se llena DataGrid es para enlazar los tipos enum al menú desplegable que está en la celda DataGrid, aquí hay un ejemplo de uno de los elementos de la colección DataGrid después de que se hubiera agregado enter image description here

Así, por ejemplo, en la imagen de arriba, me gustaría tener los dos valores de Enum de FieldTypes enum.

En mi XAML, que han especificado los siguientes:

<DataGridTemplateColumn Header="Field Type" CanUserResize="False"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox Height="20" SelectedIndex="0" ItemsSource="{Binding Path=FieldTypes}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=Value}"></Label> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Las otras columnas son vinculantes para los datos correctamente, pero éste no lo es.

No estoy seguro de si hay una mejor manera de hacerlo o no. También escribí un EnumConverter del IValueConverter para manejar las conversiones string-enum-string si alguna vez se necesita.

Gracias

Respuesta

9

Tire de la enumeración de su modelo de vista

public enum FieldTypes 
{ 
    Constant, 
    Variable, 
} 

// Don't forget to set up your INotifyPropertyChanged on your properties 
// if they are being used for binding 
public class HiddenFieldPanelViewModel 
{ 
    public List<HiddenFieldComponent> HiddenFieldList { get; set; } 
    public HiddenFieldComponent Component { get; set; } 
    public bool IsVisible { get; set; } 

    // removed: 
    // public enum FieldTypes{Constant,Variable} 

    // will likely want to set up a property such as: 
    // public enum FieldTypes {get; set;} 

    public HiddenFieldPanelViewModel() 
    { 
     HiddenFieldList = new List<HiddenFieldComponent>(); 
     IsVisible = false; 
    } 
} 

Estos serían los espacios de nombres que importe en su xaml:

xmlns:local="clr-namespace:NamespaceToYourEnum" 
xmlns:System="clr-namespace:System;assembly=mscorlib" 

Y luego puede configurar un ObjectDataProvider para enlazar el Combobox. Parte de la muestra XAML:

<Window.Resources>  
    <ObjectDataProvider x:Key="EnumDataProvider" 
         MethodName="GetValues" 
         ObjectType="{x:Type System:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:FieldTypes"/> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 

<!-- FieldTypesEnumProperty would be in your ViewModel --> 
<ComboBox Height="25" 
     SelectedItem="{Binding Path=FieldTypesEnumProperty}" 
     ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" /> 
+0

Grandes! ¡¡¡Funciona de maravilla!!! – TheJediCowboy

+0

Pregunta rápida, ¿hay alguna manera de establecer el elemento seleccionado en el cuadro combinado de acuerdo con ese elemento DataGrid? – TheJediCowboy

+1

Consulte la edición de un 'ItemsSource' actualizado y un' SelectedItem'. Básicamente, deberías vincular el elemento seleccionado a lo que se estaba utilizando para vincular la fila en tu DataGrid. La propiedad necesitaría ser OfType FieldTypes. –

1

miren algo como:

<DataTemplate> 
    <ComboBox SelectedValue="{Binding Path=EstimateStatusValueId}" 
      ItemsSource="{Binding Path=DataContext.EstimateStatusValueList, 
       RelativeSource={RelativeSource FindAncestor, 
       AncestorType={x:Type UserControl}}}" 
      DisplayMemberPath="Description" 
      SelectedValuePath="EstimateStatusValueId" /> 
</DataTemplate> 
+0

He intentado esto, y todavía no podría conseguirlo para mostrar los valores de enumeración, gracias – TheJediCowboy

0

Para cualquier persona todavía en busca de respuesta:
En .NET 4.5 que sólo tiene propiedad con el tipo de su enumeración. DataGrid crea automáticamente un cuadro combinado para usted.
Algo como esto:

public enum FieldTypes 
{ 
    Constant, 
    Variable, 
} 

public class HiddenFieldPanelViewModel 
{ 
    public FieldTypes Types { get; set; } 
} 
Cuestiones relacionadas