Tengo una pregunta sobre el enlace de datos DataGrid en WPF. Estoy usando VS 2010 Beta 2, que tiene su propia DataGrid, no Toolkit, aunque creo que es prácticamente la misma.Enlace dinámico en la plantilla WGT DataGridCell
Quiero enlazar a un conjunto de datos que tiene 52 columnas, una para cada semana del año. Por esta razón, quiero vincular los datos dinámicamente en lugar de especificar cada campo. El valor para cada campo es verdadero o falso dependiendo de alguna condición. En función de este valor, quiero mostrar una imagen en la plantilla de la celda si la condición es verdadera y ocultarla si la condición no es verdadera.
Mi problema es que todos los ejemplos de uso de plantillas que he encontrado se refieren al caso de campos predefinidos fijos, donde puede tener un enlace como Text = "{Binding UserName}". Esto no es bueno para mí porque no sé cuáles serán los nombres de los campos en el momento del diseño.
He creado un ejemplo simplificado que ilustra el problema. En este ejemplo, se genera una tabla de datos que contiene valores verdaderos y falsos. La imagen en mi plantilla nunca es visible. ¿Cómo lo haría invisible dependiendo del valor verdadero o falso en los datos?
<Window.Resources>
<!--This is the bit that doesn't work...-->
<Style TargetType="{x:Type Image}" x:Key="HideWhenFalse">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=???}"
Value="True"> <!--What to put for the path? -->
<Setter Property="Visibility">
<Setter.Value>
Visible
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<!--Up to here-->
<Style x:Key="{x:Type DataGridCell}" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<Image Source="Images/tick.bmp" Style="{StaticResource HideWhenFalse}">
</Image>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid
x:Name="myDataGrid"
AutoGenerateColumns="True" >
</DataGrid>
</Grid>
Código atrás:
pública parcial de clase MainWindow: Ventana {
public MainWindow()
{
InitializeComponent();
DataTable dtTable = new DataTable();
dtTable.Columns.Add("A", typeof(Boolean));
dtTable.Columns.Add("B", typeof(Boolean));
dtTable.Columns.Add("C", typeof(Boolean));
dtTable.Columns.Add("D", typeof(Boolean));
dtTable.Columns.Add("E", typeof(Boolean));
dtTable.Columns.Add("F", typeof(Boolean));
for (int i = 0; i < 5; i++)
{
object[] oValues = new Object[dtTable.Columns.Count];
for (int j = 0; j < dtTable.Columns.Count; j++)
{
oValues[j] = (j % 2 == 1) ? true : false;
}
dtTable.Rows.Add(oValues);
}
myDataGrid.ItemsSource = dtTable.DefaultView;
myDataGrid.Items.Refresh();
}
}
NB Esto es probablemente obvio y estoy abordando el problema de una manera completamente incorrecta. Aquí hay una confesión: he estado tratando de entender cómo funciona WPF durante un par de meses y aún me parece que me estoy acercando a CADA problema de la manera incorrecta. Espero que el centavo caiga pronto.
Gracias por su pronta respuesta, Julien. Funciona un regalo. – Richard
@Richard - debe aceptar esta respuesta – David
merci bien, ça m'a beaucoup aidé! – David