55 / 55 / 5
Регистрация: 09.06.2011
Сообщений: 207
1

Привязка к коллекции: как программно (скажем, из обработчика кнопки) добавить в эту коллекцию новый item

10.02.2012, 19:29. Показов 2935. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Есть пример из MSDN о привзке к коллекции. Не могу сообразить как программно (скажем, из обработчика кнопки) добавить в эту коллекцию новый item, и чтобы он отразился в Listbox?

Я делаю так:
VB.NET
1
2
3
4
5
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        Dim new_Name As New PersonName("Катя", "Иванова")
        Dim n_List As New NameList
        n_List.Add(new_Name)
End Sub
Но, увы, в листбокс ничего не добавляется...

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2012, 19:29
Ответы с готовыми решениями:

Как программно добавить item с картинкой в ListView
Здравствуйте. У меня есть на форме компонент ListView и ImageList с 3-мя изображениями. ImageList...

Как добавить новый item в listView?
Все доброго времени суток. Вообщем, есть у нас listView, в который надо добавить итем. Создаем...

Не могу добавить новый item в проект
С какого-то времени не могу добавить новый item в проект. Всегда появляется сообщение: The...

Как сохранить в файл, скажем, эту строку: <IMG src=images/e1.gif border=0>
как сохранить в файл, скажем, эту строку: &lt;IMG src=images/e1.gif border=0&gt; получается: &amp;lt;IMG...

15
65 / 49 / 10
Регистрация: 03.04.2011
Сообщений: 116
10.02.2012, 21:06 2
В 3-й строке вы создаете коллекцию, но никак не связываете ее с листбоксом, непонятно.
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
10.02.2012, 21:06 3
Urs, а ничего и не должно добавляться - вы просто создаете новый объект NameList, добавляете в него элемент и все. А вам еще надо этот объект указать для листбокса данный объект в качестве значения свойства ItemsSource.
например, листбокс имеет имя list1
тогда указание источника данных будет так
VB.NET
1
list1.ItemsSource = n_List
0
55 / 55 / 5
Регистрация: 09.06.2011
Сообщений: 207
10.02.2012, 21:20  [ТС] 4
Нет, это я понял... Проблема в другом, что listbox биндится к коллекции из разметки, а мне нужно добавить новый item из кода, но в коде я не создавал новых объектов, я взял код из примера MSDN и ничего в нем не менял, а там эти имена созданы сразу в классе NameList, статически, в конструкторе New... Вот я и не соображу, как добавить в уже существующий класс NameList новые item, с помощью кнопки.

Кроме того, я так понимаю, как-то нужно обновлять ResourceDictionary, после добавления нового объекта в NameList?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
10.02.2012, 21:23 5
Urs, я же вам показал, как сделать коллекцию в качестве источника данных листбокса. Затем вы можете добавлять сколько угодно элементов в коллекцию и они автоматически будут появляться в списке
0
3 / 3 / 0
Регистрация: 01.08.2011
Сообщений: 25
10.02.2012, 21:25 6
все правильно, что не работает.. у вас один екземпляр создается в кзамале другой в коде, делайте свойство типа OS<T> и биндите его, или вам принципиально нужна реализация своей колекции и наследование от OS<T>?
0
65 / 49 / 10
Регистрация: 03.04.2011
Сообщений: 116
10.02.2012, 21:57 7
Можешь сделать что-то типа такого:
C#
1
2
3
4
5
6
7
//Свойство, которое достает коллекцию из ресурсов
public NameList MyCollection
{
     get { return Resources["NameListData"] as NameList; }
}
//Ну и где-то в коде:
MyCollection.Add(new PersonName("Катя", "Иванова"));
Бейсика не знаю =)
0
55 / 55 / 5
Регистрация: 09.06.2011
Сообщений: 207
10.02.2012, 22:00  [ТС] 8
Eugene22, во-первых, у меня не совсем Listbox. Пример из MSDN я привел для наглядности:

У меня FlowDocument, к которому вот таким способом прибиндена коллекция параграфов:

XML
1
2
3
4
5
<FlowDocumentReader>
            <FlowDocument WpfTest:FlowDocumentOperations.BlockSource=
                                  "{Binding Source={StaticResource NameListData}}">              
            </FlowDocument>
</FlowDocumentReader>
Ресурсы добавляю из кода как показал мне Ortuomka:

VB.NET
1
2
3
4
5
6
7
8
9
Class MainWindow
    Dim strin() As String = {"Иван", "Пётр", "Сергей"}
    Dim MyCol As New NameList(strin)
 
    Public Sub New()
        Resources.Add("NameListData", MyCol)
        Me.InitializeComponent()
    End Sub
End Class
Сам класс NameList:

VB.NET
1
2
3
4
5
6
7
8
9
Public Class NameList
    Inherits ObservableCollection(Of Paragraph)
    Public Sub New(ByVal str() As String)
        MyBase.New()
        For i = 0 To UBound(str)
            MyBase.Add(New Paragraph(New Run(str(i))))
        Next
    End Sub
End Class
Мне нужно динамически изменять содержимое коллекции и я не знаю как это сделать... Вот поэтому морочусь...

Ortuomka, что есть OS<T> и как его реализовать?
0
3 / 3 / 0
Регистрация: 01.08.2011
Сообщений: 25
10.02.2012, 22:05 9
Urs, вы попробовали сделать как
maratoss написал?
0
55 / 55 / 5
Регистрация: 09.06.2011
Сообщений: 207
10.02.2012, 22:36  [ТС] 10
Пытаюсь, но не выходит... Исключение выскакивает... Может потому что я неправильно интерпретирую пример maratoss в Бэйсик?

VB.NET
1
2
3
4
5
Public ReadOnly Property MyCollection() As NameList
        Get
            Return Resources("NameListData")
        End Get
End Property
В коде:

VB.NET
1
MyCollection.Add(New Paragraph(New Run("Катя")))
Добавлено через 9 минут
Исключение исчезает, если убираю аргументы в конструкторе NameList, но "Катя" по-прежнему не добавляется...
0
3 / 3 / 0
Регистрация: 01.08.2011
Сообщений: 25
10.02.2012, 23:19 11
какое хоть исключени кидает?
0
55 / 55 / 5
Регистрация: 09.06.2011
Сообщений: 207
10.02.2012, 23:29  [ТС] 12
Уже не помню, что-то связанное с добавлением ресурсов... как это исключение теперь вернуть не знаю...

Аргументы в конструктор вернул, но из ресурсов Замл удалил ссылку на класс NameList и исключение пропало... Видимо был конфликт с ключём ресурсов, ибо ключи и в коде и в разметке были одинаковые...

А, "Катя", по-прежнему не добавляется... Туты её в качель!
0
3 / 3 / 0
Регистрация: 01.08.2011
Сообщений: 25
10.02.2012, 23:37 13
Urs, страно сейчас попробовал все работает, давайте полный код разметки и кодбехайнда
0
55 / 55 / 5
Регистрация: 09.06.2011
Сообщений: 207
10.02.2012, 23:48  [ТС] 14
XML
1
2
3
4
5
6
7
8
9
10
11
12
<Window x:Class="MainWindow"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    xmlns:WpfTest="clr-namespace:WpfApplication3"
    Title="MainWindow" Height="693" Width="847" >             
 <Grid>
    <FlowDocumentReader>
        <FlowDocument WpfTest:FlowDocumentOperations.BlockSource="{Binding Source={StaticResource NameListData}}">
        </FlowDocument>
    </FlowDocumentReader>
</Grid>
</Window>
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Imports System.Collections.ObjectModel
 
Class MainWindow
 
    Dim strin() As String = {"Иван", "Пётр", "Сергей"}
    Dim MyCol As New NameList(strin)
 
    Public Sub New()
        Resources.Add("NameListData", MyCol)
        Me.InitializeComponent()
    End Sub
 
    Public ReadOnly Property MyCollection() As NameList
        Get
            Return Resources("NameListData")
        End Get
    End Property
 
    Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        MyCollection.Add(New Paragraph(New Run("Катя")))
    End Sub
End Class
 
Public Class NameList
    Inherits ObservableCollection(Of Paragraph)
 
    Public Sub New(ByVal str() As String)
        MyBase.New()
        For i = 0 To UBound(str)
            MyBase.Add(New Paragraph(New Run(str(i))))
        Next
    End Sub
End Class
 
Public Class FlowDocumentOperations
    Inherits DependencyObject
    Public Shared Function GetBlockSource(ByVal obj As DependencyObject) As IEnumerable
        Return DirectCast(obj.GetValue(BlockSourceProperty), IEnumerable)
    End Function
    Public Shared Sub SetBlockSource(ByVal obj As DependencyObject, ByVal value As IEnumerable)
        obj.SetValue(BlockSourceProperty, value)
    End Sub
    Public Shared ReadOnly BlockSourceProperty As DependencyProperty = DependencyProperty.RegisterAttached("BlockSource", _
                        GetType(IEnumerable), GetType(FlowDocumentOperations), New UIPropertyMetadata(Nothing, AddressOf OnBlockSourceChanged))
    Private Shared Sub OnBlockSourceChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
        Dim FlowDocument = TryCast(d, FlowDocument)
        If FlowDocument Is Nothing Then
            Return
        End If
        FlowDocument.Blocks.Clear()
        Dim Blocks = TryCast(e.NewValue, IEnumerable)
        If Blocks IsNot Nothing Then
            For Each Block In Blocks
                FlowDocument.Blocks.Add(TryCast(Block, Block))
            Next
        End If
    End Sub
End Class
0
3 / 3 / 0
Регистрация: 01.08.2011
Сообщений: 25
10.02.2012, 23:56 15
а где?
XML
1
2
3
4
5
6
<Window.Resources>
        <c:NameList x:Key="NameListData"/>
 
 
    </Window.Resources>
    <Grid>
а вижу. вы вкоде добавляете
0
55 / 55 / 5
Регистрация: 09.06.2011
Сообщений: 207
10.02.2012, 23:59  [ТС] 16
Да, видимо с этим и было связано исключение... И там и там, два одинаковых ключа в ресурсе...
0
10.02.2012, 23:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2012, 23:59
Помогаю со студенческими работами здесь

Как добавить в пункт меню новый пукт программно
Доброе утро, делаю приложение пытаюсь сделать учусь (. Суть программы в том что каждый год вносят...

Как программно добавить кнопки на элемент panel?
Как программно добавить кнопки на элемент типа panel? У меня на форме есть panel, в нее мне нужно...

Как переместить данные из коллекции в другую коллекцию
Иметься три коллекции Dictionary&lt;string,string&gt; str = new Dictionary&lt;string,string&gt;(); ...

Программно добавить кнопки на кнопки на tabcontrol
Всем привет! На форме добавлен TabControl, на который добавляются вкладки и кнопки согласно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru