2009-10-05 20 views
2

Je travaille sur un programme dans WPF pour la première fois. J'ai un ListView en mode GridView affichant des données d'un ensemble de données lié (qui est saisi à partir d'une base de données).Remplacer par programme le contenu des cellules GridView sur la charge

Dans ma base de données, "date de naissance" n'est pas un champ obligatoire. En tant que tel, tout enregistrement sans un dob avait la valeur définie à DateTime.MinValue. À chacune de ces dates de valeur minimale, la date est indiquée dans la cellule 01/01/0001. J'essaie de trouver un moyen de formater la cellule afin que DateTime.MinValue ne s'affiche pas, ou remplacer chaque MinValue avec "". Mon idée était soit d'utiliser l'événement "Loaded" du bloc de texte où se trouve la date et de remplacer chaque instance de "01/01/0001", soit de boucler l'ensemble de données avant de l'envoyer à GridView et de supprimer/remplacer Là-bas. Je n'ai pas eu de chance pour savoir comment faire.

Mon code XAML pour le GridView est:

<Grid> 
    <ListView x:Name="resultsListView" GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler" Margin="0,54,0,28" ItemsSource="{Binding Path=Table}"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn DisplayMemberBinding="{Binding Path=LastName}" 
      Header="Last Name" 
      Width="150"/> 
     <GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}" 
      Header="First Name" 
      Width="100"/> 
     <GridViewColumn DisplayMemberBinding="{Binding Path=MiddleName}" 
      Header="Middle Name" 
      Width="100"/> 
     <GridViewColumn Header="Date of Birth" Width="100"> 
      <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock TextAlignment="Justify" Text="{Binding Path=DateOfBirth, StringFormat='{}{0:MM/dd/yyyy}'}" Loaded="TextBlock_Loaded" /> 
       </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
    </GridView> 
    </ListView.View> 
    </ListView> 
</Grid> 

Code pour le DataSet:

private void FillListView(DataSet ds) 
{ 
    if (resultsListView.Items.Count != 0) 
    { 
     resultsListView.Items.Clear(); 
    } 
    resultsListView.DataContext = ds.Tables[0].DefaultView; 
} 

Des conseils sur la façon de montrer des blancs pour DateTime.MinValue dans mon GridView serait très apprécié!

Répondre

2

Je voudrais créer un IValueConverter traitant de cela, et l'inclure dans votre expression de liaison.

Dans vos ressources:

<local:DateTimeConverter x:Key="DateTimeConverter" /> 

jour Ensuite, votre reliure:

<TextBlock Text="{Binding Path=DateOfBirth, 
          Converter={StaticResource DateTimeConverter}, 
          ConverterParameter='MM/dd/yyyy'}" /> 

Définissez ensuite la classe:

public class DateTimeConverter : IValueConverter 

Cela a deux méthodes. Vous devez seulement implémenter Convert (sauf si vous envisagez d'utiliser une liaison bidirectionnelle). Dans cette méthode, vous pouvez prendre la chaîne de format via un paramètre (comme je l'ai passé dans l'expression de liaison ci-dessus) et aussi vérifier DateTime.MinValue et retourner une chaîne vide.

+0

Parfait, merci! J'ai utilisé le code Convert/Convert Back d'ici: http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx - la seule chose qui m'a bloqué était de savoir comment déclarer mon espace de noms dans le xaml. Pour tout le monde, vous devez utiliser xmlns: local = "clr-namespace: -votre espace de noms-" –

+0

De rien. Les convertisseurs de valeur sont vraiment utiles pour ce genre de chose. Vous pouvez définir des propriétés publiques sur votre classe de convertisseur, puis ajouter des ressources différentes avec des configurations différentes. Par exemple, vous pourriez avoir un booléen qui contrôle si DateTime.MinValue est masqué, alors vous pouvez réutiliser la même classe de différentes manières. –