как программно добавить новый элемент в настраиваемый список с помощью С#

у меня есть этот настраиваемый список, который я создал с помощью Microsoft Expression Blend, который содержит три элемента (изображение, имя и текст).. и это код шаблона ListBox!!

<DataTemplate x:Key="ListBoxTemplate">
    <Grid Width="320" Height="80" Background="#FFCAE5DE">
        <Grid.RowDefinitions>
            <RowDefinition Height="60"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="70"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Path Grid.ColumnSpan="1" Data="M8.4999981,6.8212103E-13 L256.5,6.8212103E-13 C261.19443,-1.8775456E-06 265,3.8055778 265,8.4999981 L265,55.499998 C265,60.194418 261.19443,63.999998 256.5,63.999998 L52.689537,63.999998 52.702888,75.988852 45.902157,63.999998 8.4999981,63.999998 C3.8055797,63.999998 0,60.194418 0,55.499998 L0,8.4999981 C0,3.8055778 3.8055797,-1.8775456E-06 8.4999981,6.8212103E-13 z" 
                          Fill="#FF3E977D" Height="Auto" Margin="5,5,8,-11" StrokeStartLineCap="Round" Stretch="Fill" StrokeEndLineCap="Round" StrokeDashCap="Round" Stroke="Black" StrokeThickness="0" 
                          StrokeLineJoin="Round" VerticalAlignment="Stretch" Grid.Column="1" Opacity="0.535" />
        <Border Margin="10,5,0,-2" BorderBrush="Black" BorderThickness="1" Height="Auto" CornerRadius="4">
            <Image Source="{Binding Path=ImageURL}" Stretch="Fill" Width="Auto" Height="Auto" />
        </Border>

        <StackPanel Orientation="Horizontal" TextBlock.FontWeight="Bold" Height="Auto" Width="Auto" Grid.Column="1" Margin="5,5,0,-11">
            <TextBlock Text="{Binding Path=Text}" Width="400" Margin="3,2,0,16" Height="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" TextAlignment="Justify" TextWrapping="Wrap" ScrollViewer.HorizontalScrollBarVisibility="Auto"/>
        </StackPanel>

        <StackPanel Margin="0,47,43.5,-51" Grid.Column="1" Height="Auto" HorizontalAlignment="Stretch" Width="Auto" Grid.Row="1">
            <TextBlock Text="{Binding Path=Name}" Height="20" Margin="60,20,8,0" Width="Auto"/>
        </StackPanel>
    </Grid>
</DataTemplate>

как видите, у меня есть три привязки (ImageURL, Text и Name). Теперь, что я хочу сделать, это реализовать метод на С#, который позволит мне добавить новый элемент в этот список. И для начала я нашел несколько примеров добавления lisboxitem с помощью С#, но я не знаю, как применить его с моим настроенным списком... метод в С# был примерно таким!

private ListBoxItem AddItem(string imageUrl, string text, string name)
{ 
    ListBoxItem item = new ListBoxItem();
    /* the
       code
       of 
       the 
       customized
       ListBox */
     item.content = content;
     return item;
}

вопрос в том, как я могу добавить новый элемент в настраиваемый список, когда я вызываю метод AddItem(imageUrl, text, name)?

Любые идеи .. Любая помощь будет более чем оценена.

@Margnus Johnansson большое спасибо за решение. но все же есть одна проблема.. что если я хочу добавить несколько элементов, что мне делать?!! это метод, который я реализовал..

public void Additem(string imageUrl, string text, string name)
    {
        ObservableCollection<Person> Items = new ObservableCollection<Person>();

        MyListBox.ItemsSource = Items;

        Items.Add(new Person() { Image = imageUrl, Text = text, Names = name });
    }

этот метод добавляет только один элемент, даже если я вызываю его несколько раз, но дело в том, что я хочу добавлять новый элемент в список каждый раз, когда я вызываю метод

Additem(string imageUrl, string, text, string name)

без перезаписи других элементов !!

Спасибо за понимание.


person NoobMaster69    schedule 25.03.2012    source источник
comment
Вы не должны создавать ObservableCollection внутри вашего метода Add. Например, поместите этот глобальный объект на страницу/окно в конструкторе. Это причина, по которой вы видите описанную вами проблему, так как вы будете сбрасывать и очищать ее каждый раз, когда добавляете элемент. Пока вы это делаете, также переместите назначение MyListBox.ItemsSource наружу (например, в конструкторе или при загрузке страницы)   -  person Magnus Johansson    schedule 25.03.2012
comment
проблема решена благодаря вам!!   -  person NoobMaster69    schedule 26.03.2012


Ответы (1)


Вы действительно должны взглянуть на привязку данных, это очень поможет.

Суть в том, что вы создаете модель, представляющую элемент:

public class MyItem
{
  public string ImageUrl { get; set; }
  public string Text { get; set; }
  public string Name { get; set; }
}

а затем вы создаете привязываемую коллекцию этих элементов модели:

ObservableCollection<MyItem> Items{get;set;}

и привяжите свой ListView к этой коллекции:

Items = new ObservableCollection<MyItem>();
myListBox.ItemsSource = Items;

Наконец, вы можете добавить такие элементы:

Items.Add(new MyItem() { ImageUrl = "http://..", Text = "My Text", Name = "My Name" });

Из-за мощной привязки данных ListBox должен подхватить изменения, которые вы внесли в коллекцию, и вы должны увидеть новый элемент в ListBox.

person Magnus Johansson    schedule 25.03.2012
comment
вау чувак, это гениально!! это действительно работает, но все же есть одна проблема... что, если я хочу добавить несколько элементов?!! что мне делать ? - person NoobMaster69; 25.03.2012
comment
Я обратился к вашей проблеме в комментарии к вашему вопросу. - person Magnus Johansson; 25.03.2012