2013-11-12 5 views
1

Я искал везде, но я не нашел ни одного хорошего примера или учебника для этого. У меня есть ListBox, и я сделал ItemTemplate для него:WPF Listbox добавить элемент с шаблоном

XAML:

<ListBox x:Name="LB_Playlist" ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalAlignment="Left" Height="454" Margin="0,23,0,0" VerticalAlignment="Top" Width="264" Background="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0" ItemTemplate="{DynamicResource PlayListItem}" ScrollViewer.VerticalScrollBarVisibility="Hidden"> 
      <ListBox.Resources> 
       <DataTemplate x:Key="PlayListItem"> 
        <Grid d:DesignWidth="127" d:DesignHeight="105" Width="128" Height="128"> 
         <Label x:Name="L_PlayListName" Content="{Binding Path=PlayList_Name}" HorizontalAlignment="Stretch" Margin="16" Width="Auto" Height="Auto" Background="#26000000" Padding="0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontFamily="BankGothic Lt BT"/> 
        </Grid> 
       </DataTemplate> 
      </ListBox.Resources> 
    </ListBox> 

Как я могу добавить новый элемент, используя код (динамический) меняющийся L_PlayListName каждый раз содержимое с другим именем? Мне нужно сделать новый класс или что-то еще? У меня есть кнопка для добавления нового элемента. Как я могу это сделать?

+0

шаблона вы имеете в виду стиль? или шаблон элемента? можете ли вы показать, что вы пытаетесь? – sexta13

+0

@ sexta13, автор вопроса * сделал * добавить код, но он был скрыт, потому что раньше он не помещал новую строку ... Я только что исправил его. – Sheridan

+0

Похоже, вам просто нужно поднять событие PropertyChanged на свойство PlayList_Name, или вы спрашиваете, как сменить все элементы ItemsTemplate на лету? –

ответ

2

Сначала создайте свойство коллекции в коде позади:

public ObservableCollection<string> PlayListNames { get; set; } 

Тогда Bind это к ListBox.ItemsSource:

<ListBox ItemsSource="{Binding PlayListNames}" ... /> 

Изменение XAML немного:

<Label x:Name="L_PlayListName" Content="{Binding}" /> 

Это будет Bind к целому значению для каждого элемента, и в этом случае это означает один из значений string из коллекции.

Наконец, просто установите DataContext вашего Window. Есть несколько способов сделать это, и самый простой (но не лучше), чтобы сделать это в MainWindow.xaml.cs конструктору:

DataContext = this; 

Вот это ... дайте мне знать, если у вас есть какие-либо проблемы.

+0

Работает как следует. И если я хочу добавить больше ярлыков и отредактировать их? Как название плейлиста и, скажем, имя первой песни. Два ярлыка один под другим.Могу ли я сделать то же самое или это будет сложнее? –

+0

Это будет в основном то же самое. Однако вам нужно будет создать класс типа данных (который должен * реализовать интерфейс 'INotifyPropertyChanged') и определить свойство для каждого поля, которое вы хотите отобразить. Затем просто замените свойство 'ObservableCollection ' для свойства 'ObservableCollection ' (или того, что вы называете вашим типом). Наконец, вам нужно установить 'Binding' на' Label ', как вы делали в своем вопросе, используя имена свойств ... все остальное должно оставаться неизменным. – Sheridan

0

O'k если ваш просто добавить строки в список воспроизведения, вы должны изменить шаблон к следующему

<DataTemplate x:Key="PlayListItem">   
    <Label x:Name="L_PlayListName" Content="{Binding}" />   
    </DataTemplate> 

Но вы должны использовать ObservableCollection и сделать его легко и правильно.

1
<Grid x:Name="LayoutRoot"> 
    <ListBox Margin="10" ItemsSource="{Binding}"/> 
</Grid> 

перед Binding и можно написать имя столбца таблицы (таблицы базы данных)

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    BindData();   
} 

private void BindData() 
{ 
    DataSet dtSet = new DataSet(); 
    using (connection = new SqlConnection(connectionString)) 
    { 
     command = new SqlCommand(sql, connection);    
     SqlDataAdapter adapter = new SqlDataAdapter();   
     connection.Open(); 
     adapter.SelectCommand = command; 
     adapter.Fill(dtSet, "Customers"); 
     listBox1.DataContext = dtSet; 

    } 
} 
Смежные вопросы