2010-12-09 22 views
0

Je suis en train d'apprendre comment développer et construire une application pour Windows Phone 7.Ajout d'un TextBlock avant un autre élément dans une zone de liste

Si une certaine valeur est vrai, je dois ajouter un TextBlock au ListBox avant un TextBlock (disons que son nom est x:Name="dayTxtBx").

J'utilise actuellement

dayListBox.Items.Add(dayTxtBx); 

ajouter la zone de texte.

Toute aide très appréciée!

Merci

+0

Que signifie "avant"? _Above_ ou _à gauche de_? Aussi, je recommande de mieux utiliser Data Binding: http://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspx –

+0

ci-dessus. Existe-t-il un moyen d'utiliser la liaison de données et insérer une zone de texte lorsque la valeur d'un élément change? – Jamie

Répondre

3
Ce

est assez facile à faire si vous utilisez un DataTemplate et un ValueConverter et passer tout l'objet dans la zone de liste (plutôt que juste une chaîne). En supposant que vous avez un objet qui ressemble à:

public class SomeObject: INotifyPropertyChanged 
{ 
    private bool mTestValue; 
    public bool TestValue 
    { 
     get {return mTestValue;} 
     set {mTestValue = value; NotifyPropertyChanged("TestValue");} 
    } 
    private string mSomeText; 
    public string SomeText 
    { 
     get {return mSomeText;} 
     set {mSomeText = value; NotifyPropertyChanged("SomeText");} 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string name) 
    { 
     if ((name != null) && (PropertyChanged != null)) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

Vous pouvez faire un convertisseur qui ressemble à:

public class BooleanVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null && (bool)value) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Et ajoutez le convertisseur à votre XAML comme ceci:

<UserControl x:Class="MyProject.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MyProject"> 
    <UserControl.Resources> 
     <local:BooleanVisibilityConverter x:Key="BoolVisibilityConverter" /> 
    <UserControl.Resources> 

Ensuite, vous pourriez avoir le ListBox défini en XAML comme si:

<Listbox> 
    <Listbox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orentation="Horizontal" > 
     <TextBlock Text="Only Show If Value is True" Visibility={Binding TestValue, Converter={StaticResource BoolVisibilityConverter}} /> 
     <TextBlock Text="{Binding SomeText}" /> 
     </StackPanel> 
    </DataTemplate> 
    </Listbox.ItemTemplate> 
</Listbox> 

Peut sembler beaucoup, mais c'est vraiment très simple une fois que vous avez commencé. Un excellent moyen d'en savoir plus sur la liaison de données et les convertisseurs est sur le blog de Jesse Liberty (http://jesseliberty.com/?s=Windows+Phone+From+Scratch).

+0

Merci d'utiliser votre idée de visibilité, j'ai réussi à utiliser mon implimentation actuelle avec la liaison de données. – Jamie