Добавление TextBlock перед другим элементом в ListBox - PullRequest
0 голосов
/ 09 декабря 2010

В настоящее время я изучаю, как разработать и создать приложение для Windows Phone 7.

Если определенное значение истинно, мне нужно добавить TextBlock в ListBox перед TextBlock (скажем, его имяx:Name="dayTxtBx").

В настоящее время я использую

dayListBox.Items.Add(dayTxtBx);

для добавления текстового поля.

Любая помощь очень ценится!

Спасибо

1 Ответ

3 голосов
/ 09 декабря 2010

Это довольно легко сделать, если вы используете DataTemplate и ValueConverter и передаете весь объект в ListBox (а не просто строку).Предполагая, что у вас есть какой-то объект, который выглядит следующим образом:

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));
        }
    }
}

Вы можете создать конвертер, который выглядит так:

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();
    }
}

И добавить конвертер в свой XAML следующим образом:

<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>

Тогда вы могли бы задать ListBox, определенный в XAML, примерно так:

<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>

Может показаться, что это много, но с самого начала все становится довольно просто.Отличный способ узнать больше о привязке данных и конвертерах - в блоге Джесси Либерти (http://jesseliberty.com/?s=Windows+Phone+From+Scratch).

...