powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / binding listbox к observecollection в xaml
12 сообщений из 12, страница 1 из 1
binding listbox к observecollection в xaml
    #39316105
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Задача простая, но никак не могу ее разрешить.
Хочу привязать observecollection к listbox в xaml-коде.
Исходники следующие:

класс объекта- строки представляющий собой запись в listbox
Код: vbnet
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.
59.
60.
61.
Imports System.ComponentModel

Public Class dn

    Dim dn_no As String
    Dim ddep As String
    Dim dest As String
    Dim balans As Decimal

    Public Property mydn As String
        Get
            Return dn_no
        End Get

        Set(ByVal value As String)
            dn_no = value
        End Set
    End Property
    Public Property _ddep As String
        Get
            Return ddep
        End Get

        Set(ByVal value As String)
            ddep = value
        End Set
    End Property

    Public Property _dest As String
        Get
            Return dest
        End Get

        Set(ByVal value As String)
            dest = value
        End Set
    End Property

    Public Property _balanc As Decimal
        Get
            Return balans
        End Get

        Set(ByVal value As Decimal)
            balans = value
        End Set
    End Property

    Sub New(dn As String,
            ddep As String,
            dest As String,
            balans As Decimal)

        Me.dn_no = dn
        Me.ddep = ddep
        Me.dest = dest
        Me.balans = balans

    End Sub

End Class



код окна MainWindow.xaml.vb
Код: vbnet
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.
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Collections.ObjectModel

Class MainWindow

    Public Sub New()

        Dim cn = New SqlConnection(
            ConfigurationManager.ConnectionStrings("ms_cn").ConnectionString)
        Dim cm As New SqlCommand("get_info_bp", cn)

        cm.CommandType = System.Data.CommandType.StoredProcedure

        InitializeComponent()
        Dim recColl = New ObservableCollection(Of dn)

        cn.Open()
        Dim reader As SqlDataReader = cm.ExecuteReader()

        Using cn
            While reader.Read()
                'adding row data to observable
                recColl.Add(New dn(reader("My_dn_no").ToString, reader("ddep").ToString, reader("dest").ToString, reader("balans").ToString))
            End While
        End Using

        ' Me.lbx.ItemsSource = recColl

    End Sub


End Class



код xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<Window x:Class="MainWindow" x:Name="mwnd"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
      
        
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <ListBox Name="lbx"  ItemsSource="{Binding Path=recColl}" DisplayMemberPath="mydn"  >
        </ListBox>

    </Grid>
</Window>



Проблема в следующем: если я раскоментирую строку " ' Me.lbx.ItemsSource = recColl" , т.е. сделаю привязку в codebehind, то listbox отображает объекты, но мне нужно привязать декларативно- т.е. в xaml- разметке. Но listbox в таком случае получается пустым.
В окне интерпретации пишет следующее сообщение :
System.Windows.Data Error: 40 : BindingExpression path error: 'recColl' property not found on 'object' ''MainWindow' (Name='mwnd')'. BindingExpression:Path=recColl; DataItem='MainWindow' (Name='mwnd'); target element is 'ListBox' (Name='lbx'); target property is 'ItemsSource' (type 'IEnumerable')

Как это можно обойти? Спасибо
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316153
Crane11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub,

я не силен в бейсиках
есть подозрение, что
Dim recColl = New ObservableCollection(Of dn) - это локальная переменная,
биндиться же вы должны на public property.

объявите recColl как public property
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316167
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crane11,
делал по полной аналогии с http://www.cyberforum.ru/wpf-silverlight/thread539442.html

там класс объявлен как
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<Person> ppl;
        public MainWindow()
        {
            InitializeComponent();
            ppl = new ObservableCollection<Person>();
      //     listBox1.ItemsSource = ppl;
            ppl.Add(new Person { Name = "One", Age = 15 });
        }
 
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            ppl.Add(new Person { Name = "Two", Age = 25 });
   
        }
    }
}



так же как и в этом посте поменял на
ItemsSource="{Binding Path=recColl,RelativeSource={RelativeSource FindAncestor,AncestorType=Window}}"

но чет не работает все равно
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316176
Crane11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub,

1) public ObservableCollection<Person> ppl; - это не property, биндинг на него не будет работать. объявите как свойство.
2) читайте про INotifyPropertyChanged
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316185
Crane11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub,

кстати, у Вас тут без INotifyPropertyChanged отработает, поскольку ItemsSource смотрит на ObservableCollection и при добавлении нового элемента INotifyCollectionChanged стрельнет, но отсутствие понимания зачем и как работает INotifyPropertyChanged вам потом аукнится.

public ObservableCollection<Person> ppl {get;set;}

тот пример запускает.
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316217
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subтак же как и в этом посте поменял на
ItemsSource="{Binding Path=recColl,RelativeSource={RelativeSource FindAncestor,AncestorType=Window}}"
Не верьте всему, что пишут в интернетах - там часто пишут ерунду. В данном случае, например, у окна и у листбокса датаконтекст один и тот же, и никакой поиск по иерархии не нужен.
Причина, как уже написали выше - recColl должно быть свойством, а не полем.
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316247
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
весело наверное, потом такой код разгребать, когда коллега уволится :) mydn, ddep, очень информативно =)
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316253
Crane11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,
ага, а открытие SQLReader в кодбехайнде не смутило :)

да ну видно же, что код не промышленный человек первые шаги делает.
Взял неудачный пример запустить его не получилось.
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39316921
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно удачный работающий пример байндинга к observecollection, чтобы было с чего начать?
Что не так с открытием SQLReader в кодбехайнде ?
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39317306
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subА можно удачный работающий пример байндинга к observecollection, чтобы было с чего начать?
Что не так с открытием SQLReader в кодбехайнде ?
https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwiGy-iSy7LPAhXMKiwKHcOWBJUQFggeMAA&url=https://msdn.microsoft.com/ru-ru/library/ms668604(v=vs.110).aspx&usg=AFQjCNH7yglcwltnXVkcJINIZpxGgtEzYw&sig2=Y081kQnF7EVULHo4_tXXeg&cad=rjt
https://ru.wikipedia.org/wiki/Model-View-ViewModel
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39319742
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создал viewmodel в отдельном классе
Код: vbnet
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.
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Imports System.Configuration
Imports System.Data.SqlClient


Namespace VM_namespace
    Public Class VM
        Implements INotifyPropertyChanged

        Private recColl As ObservableCollection(Of dn)
        Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

        Public Property rc() As ObservableCollection(Of dn)
            Get
                Return recColl
            End Get
            Set
                recColl = Value
            End Set
        End Property
        Public Sub New()
            Me.rc = getcol()
        End Sub

        Private Function getcol()
            Dim cn = New SqlConnection(
          ConfigurationManager.ConnectionStrings("ms_cn").ConnectionString)
            Dim cm As New SqlCommand("get_info_bp", cn)

            cm.CommandType = System.Data.CommandType.StoredProcedure

            Dim recColl = New ObservableCollection(Of dn)

            cn.Open()
            Dim reader As SqlDataReader = cm.ExecuteReader()

            Using cn
                While reader.Read()
                    'adding row data to observable
                    recColl.Add(New dn(reader("My_dn_no").ToString, reader("ddep").ToString, reader("dest").ToString, reader("balans").ToString))
                End While
            End Using

            Return recColl
        End Function
    End Class

End Namespace



в xaml-коде подключил пространство имен и установил DataContext

Код: xml
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.
<Window x:Class="MainWindow" x:Name="mwnd"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewmodel="clr-namespace:WpfApplication1.VM_namespace"  
        mc:Ignorable="d"     
        Title="MainWindow" Height="350" Width="525">

    
    <Window.DataContext>
        <viewmodel:VM/>
    </Window.DataContext>

    
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <ListBox Name="lbx" ItemsSource="{Binding Path=rc}"  >
        </ListBox>

    </Grid>
</Window>



codebehind окна

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Collections.ObjectModel

Class MainWindow

    Public Sub New()

        'Dim MyViewModel = New VM_namespace.VM
        'Me.DataContext = MyViewModel

    End Sub


End Class



Если я раскомментирую код, то все работает. То есть если я сделаю привязку визуальной модели в codebehind, то получается. Однако хочу сделать привязку визуальной модели в xaml.
ErrorMessage: ссылка на объект не указывает на экземпляр объекта. То есть я понимаю, что xaml лезет в визуальную модель, но не находит нового экземпляра этой модели, поэтому нужно создать новый экземпляр VM, но я не могу понять где именно в модели нужно создать этот новый экземпляр, чтобы он нормально заработал в xaml- разметке. Подскажите в правильном направлении плиз.
...
Рейтинг: 0 / 0
binding listbox к observecollection в xaml
    #39319785
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создавайте модель в App.xaml, а привязывайте к окну через StaticResource
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / binding listbox к observecollection в xaml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]