ProblemaEl uso de fijaciones para controlar el orden de columna en una cuadrícula de datos
Tengo un kit de herramientas de WPF DataGrid
, y me gustaría ser capaz de cambiar entre varios órdenes de columnas predefinidas. Este es un proyecto de MVVM, por lo que los pedidos de columnas se almacenan en un ViewModel
. El problema es que no puedo hacer que los enlaces funcionen para la propiedad DisplayIndex
. No importa lo que intente, incluyendo el método dulce en this Josh Smith tutorial, me sale:
El DisplayIndex para la DataGridColumn con 'ID' de cabecera está fuera del intervalo. DisplayIndex debe ser mayor o igual que 0 y menor que Columns.Count. Nombre del parámetro: displayIndex. El valor real fue -1.
¿Hay alguna solución para esto?
Estoy incluyendo mi código de prueba a continuación. Por favor avíseme si ve algún problema con eso.
código de modelo de vista
public class MainViewModel
{
public List<Plan> Plans { get; set; }
public int IdDisplayIndex { get; set; }
public int NameDisplayIndex { get; set; }
public int DescriptionDisplayIndex { get; set; }
public MainViewModel()
{
Initialize();
}
private void Initialize()
{
IdDisplayIndex = 1;
NameDisplayIndex = 2;
DescriptionDisplayIndex = 0;
Plans = new List<Plan>
{
new Plan { Id = 1, Name = "Primary", Description = "Likely to work." },
new Plan { Id = 2, Name = "Plan B", Description = "Backup plan." },
new Plan { Id = 3, Name = "Plan C", Description = "Last resort." }
};
}
}
Plan de Clase
public class Plan
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
código Ventana - esto utiliza Josh Smith's DataContextSpy
<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"
xmlns:mwc="http://schemas.microsoft.com/wpf/2008/toolkit"
Title="Main Window" Height="300" Width="300">
<Grid>
<mwc:DataGrid ItemsSource="{Binding Plans}" AutoGenerateColumns="False">
<mwc:DataGrid.Resources>
<local:DataContextSpy x:Key="spy" />
</mwc:DataGrid.Resources>
<mwc:DataGrid.Columns>
<mwc:DataGridTextColumn
Header="ID"
Binding="{Binding Id}"
DisplayIndex="{Binding Source={StaticResource spy}, Path=DataContext.IdDisplayIndex}" />
<mwc:DataGridTextColumn
Header="Name"
Binding="{Binding Name}"
DisplayIndex="{Binding Source={StaticResource spy}, Path=DataContext.NameDisplayIndex}" />
<mwc:DataGridTextColumn
Header="Description"
Binding="{Binding Description}"
DisplayIndex="{Binding Source={StaticResource spy}, Path=DataContext.DescriptionDisplayIndex}" />
</mwc:DataGrid.Columns>
</mwc:DataGrid>
</Grid>
</Window>
Nota: Si sólo tiene que utilizar los números de civil para DisplayIndex
, todo funciona bien, así que el problema es, sin duda, con las fijaciones.
actualización 5/1/2010
Estaba haciendo un poco de mantenimiento en mi proyecto, y me di cuenta de que cuando me encontré con él, el problema discuto en este puesto había regresado. Sabía que funcionó la última vez que lo ejecuté, así que eventualmente reduje el problema al hecho de que había instalado una versión más nueva de WPF Toolkit (Feb '10). Cuando volví a la versión de junio de 2009, todo volvió a funcionar bien. Por lo tanto, ahora estoy haciendo algo que debería haber hecho en primer lugar: estoy incluyendo el WPFToolkit.dll que funciona en la carpeta de mi solución y lo controlo en el control de la versión. Sin embargo, es desafortunado que el kit de herramientas más nuevo tenga un cambio radical.
Bueno, esto es interesante. Si ejecuto mi aplicación de prueba, tu solución funciona perfectamente. En mi aplicación real, el 'DataGrid' en cuestión está realmente en un' UserControl', y por alguna razón, si aplico el 'DataContextSpy' (que no intenté hasta ahora, ya que había fallado en mi aplicación de prueba) , funciona incluso si no pospongo la llamada a 'InitializeComponent()'. Creo que esto debe ser porque solo estoy configurando 'Content' en' ContentControl' en lugar de hacer 'window.Show()'. En cualquier caso, gracias por tomarse el tiempo para resolver esto por mí (+1 y √). – devuxer