powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Привязка ListBox к ресурсам страницы с использованием ItemTemplate
13 сообщений из 13, страница 1 из 1
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39078095
Володимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код примера простой, ошибок нет, но не работает.
Пытался я найти работающий пример в интернет либо MSDN, но почему то все примеры содержат только XAML- код
а самого источника данных нигде нет - то есть запустить примеры невозможно. Приходится собирать по частям/
Помогите, если можете.

В примере два элемента ListBox,
первый я хочу заполнить из XAVL, а второй программно из C#/
Но данные туда не попадают, хотя количество строчек правильное.

Вот XAML код
Код: 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.
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.
<Page x:Class="WpfApplication1.Exsamples_MWS3.ObservableCollection_binding.Binding02_ListBox_ItemTemplate"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="1000"
      Title="Easy1"
      
      xmlns:c="clr-namespace:WpfApplication1.Exsamples_MWS3.ObservableCollection_binding"
  >


  <Page.Resources>
    <!--==================================================
    You can make the collection available for binding the same way you would with other common language runtime (CLR) objects, 
    as described in How to: Make Data Available for Binding in XAML. 
    For example, you can instantiate the collection in XAML and specify the collection as a resource, as shown here:-->
    <c:NameList x:Key="NameListData"/>
  </Page.Resources>

  <StackPanel Orientation="Horizontal">

    <ListBox  x:Name="list1"
      Width="200" Height="150" Margin="5"
         ItemsSource="{Binding Source={StaticResource NameListData}}"
         IsSynchronizedWithCurrentItem="True">
      <!--ItemTemplate="{StaticResource NameItemTemplate}"-->
      <ListBox.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <TextBox Text="aaaaaaaa"/>
            <TextBox Text="{Binding Source=NameListData, Path=Firstname}"/>
            <TextBox Text="{Binding Source=NameListData, Path=LastName}"/>
          </StackPanel>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>

    <ListBox x:Name="list2"
      Width="100" Height="130" Margin="5" Background="LightCyan"
         IsSynchronizedWithCurrentItem="True">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <TextBox Text="aaaaaaaa"/>
            <TextBox Text="{Binding Source=NameListData, Path=Firstname}"/>
            <TextBox Text="{Binding Source=NameListData, Path=LastName}"/>
          </StackPanel>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
  
  </StackPanel>
</Page>




А это C#

Код: c#
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//bvl   
using System.Data;
using System.Data.SqlClient;
using System.Data.Common;
using System.Configuration; // нужно для соединения с БД    
using System.Collections.ObjectModel;  // нужно для ObservableCollection
using System.Collections;  // нужно для ArrayList





namespace WpfApplication1.Exsamples_MWS3.ObservableCollection_binding {

  ///////////////////////////////////////////////////////////////////////////////
  //1. How to: Create and Bind to an ObservableCollection
  //     ms-xhelp:///?method=page&id=6CF7E275-DF76-41C6-A611-53B889B8FD5A&locale=en-US&vendor=Microsoft&format=html&topicversion=110&topiclocale=EN-US
  ///////////////////////////////////////////////////////////////////////////////
  
  //2. - http://www.cyberforum.ru/wpf-silverlight/thread539442.html


  public partial class Binding02_ListBox_ItemTemplate : Page {
    public Binding02_ListBox_ItemTemplate( ) {
      InitializeComponent( );
      ObservableCollection<PersonName> oc2 = new NameList();
      list2.ItemsSource = oc2;
    }
  }


  //===========================================
  public class NameList : ObservableCollection<PersonName> {
    public NameList( )
      : base( ) {
      Add( new PersonName( "Willa", "Cather" ) );
      Add( new PersonName( "Isak", "Dinesen" ) );
      Add( new PersonName( "Victor", "Hugo" ) );
    }
  }




//==================================================
  public class PersonName {
    private string firstName;
    private string lastName;

    public PersonName( string first, string last ) {
      this.firstName = first;
      this.lastName = last;
    }

    public string FirstName {
      get { return firstName; }
      set { firstName = value; }
    }

    public string LastName {
      get { return lastName; }
      set { lastName = value; }
    }
  }


}
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39078264
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
	<Window.Resources>
		<DataTemplate x:Key="specialDataTemplate">
			<Grid Width="107">
				<Grid.Background>
					<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
						<GradientStop Color="Black" Offset="0"/>
						<GradientStop Color="#FFCB2D2D" Offset="1"/>
					</LinearGradientBrush>
				</Grid.Background>
				<TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Foreground="White" Text="{Binding .}"/>
			</Grid>
		</DataTemplate>
	</Window.Resources>
    <Grid>
    	<ComboBox HorizontalAlignment="Left" Margin="10,21,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding carsList}" SelectedItem="{Binding selectedOne}"/>
    	<Label Content="{Binding selectedOne, Mode=TwoWay}" HorizontalAlignment="Left" Margin="13,66,0,0" VerticalAlignment="Top" Width="117" Height="26"/>
    	<ListBox HorizontalAlignment="Left" Height="186" VerticalAlignment="Top" Width="100" Margin="178,21,0,0" ItemsSource="{Binding carsList}" ItemTemplate="{DynamicResource specialDataTemplate}"/>
        
    </Grid>
</Window>
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39078268
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {

        private ObservableCollection<string> _carsList;

        public ObservableCollection<string> carsList
        {
            get { return _carsList; }
            set {
                _carsList = value;
                onPropertyChanged("carsList");
            }
        }

        private string _selectedOne;

        public string selectedOne
        {
            get { return _selectedOne; }
            set 
            {
                _selectedOne = value;
                onPropertyChanged("selectedOne");
            }
        }

        public MainWindow()
        {
            InitializeComponent();

            carsList = new ObservableCollection<string>();
            carsList.Add("TOYOTA");
            carsList.Add("BMW");
            carsList.Add("NISSAN");


            Loaded += MainWindow_Loaded;
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = this;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void onPropertyChanged(string prop)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }
    }
}
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39078354
Володимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, замечательно работает всё.
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39087640
Володимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё работает, только непонятно, зачем нужен код
Код: c#
1.
2.
3.
4.
void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = this;
        }


В смысле я вообще не понял что означает строчка this.DataContext = this; и почему без неё не работает.
На мой взгляд и без того источник данных назначен строчкой
Код: c#
1.
list2.ItemsSource = oc2;



Интересно также, что selectedOne.set вызывается 2 раза при одном событии SelectionChanged
От меня это вроде никак не завсисит, потому что никакого моего кода в промежуток времени между
этими двумя вызовами не выполнятся. То есть
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39087661
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодимирВсё работает, только непонятно, зачем нужен код
Код: c#
1.
2.
3.
4.
void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = this;
        }


В смысле я вообще не понял что означает строчка this.DataContext = this; и почему без неё не работает.
На мой взгляд и без того источник данных назначен строчкой
Код: c#
1.
list2.ItemsSource = oc2;



Интересно также, что selectedOne.set вызывается 2 раза при одном событии SelectionChanged
От меня это вроде никак не завсисит, потому что никакого моего кода в промежуток времени между
этими двумя вызовами не выполнятся. То есть
код this.DataContext = this и не нужен, для него существует RelativeSource в Binding
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39089907
Володимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я попробовал предложенный вариант

Работает, но получилось значительно сложнее
А именно, вместо одной короткой строчки пришлось написат 3 длинных
Вариант получился такой
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    <!--<ComboBox HorizontalAlignment="Left" Margin="10,21,0,0" VerticalAlignment="Top" Width="120"  Height="30"
              ItemsSource="{Binding carsList}" 
              SelectedItem="{Binding selectedOne}"/>-->
   <ComboBox HorizontalAlignment="Left" Margin="10,21,0,0" VerticalAlignment="Top" Width="120"  Height="30"
              ItemsSource="{Binding Path=carsList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
              SelectedItem="{Binding Path=selectedOne,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
              />
      


    <!--<Label HorizontalAlignment="Left" Margin="13,66,0,0" VerticalAlignment="Top" Width="117" Height="26" Background="AntiqueWhite"
           Content="{Binding selectedOne, Mode=TwoWay}" 
           />-->
    <Label HorizontalAlignment="Left" Margin="13,66,0,0" VerticalAlignment="Top" Width="117" Height="26" Background="AntiqueWhite"
           Content="{Binding Path=selectedOne, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"></Label>


(Закомментированные строчки это предыдущий короткий вариант)
Может быть я чего-то не учёл?
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39089980
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто для WPF нужно использовать MVVM шаблон, а не вот "это" и проблем не будет вообще
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39090115
Володимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший совет, но хотелось бы примерчик MVVM попроще
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39092394
Володимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня задача оказалась чуть сложнее
Надо чтобы в поле метки при редактировании страницы было написано "не выбрано"
(Точнее мне это надо сделать с кнопками, но в обсуждаемом примере кнопок нет, но это ведь всё равно, кнопка или метка)
Но поскольку значение отображаемое в метке вычисляется после запуска програмы, на этапе разработки никакой надписи нет.
То есть, все кнопки у меня слепые в момент разработки, что очень неудобно.
Я не нашёл пока способа это исправить, потому что привязать Content к двум разным источника нельзя.
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39092830
Володимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если надпись на кнопке привязана к свойству страницы, то в дизайнере этой надписи не видно
(кнопка слепая - просто квадратик), надпись же проявляется только после запуска программы.
Можно на WFP написать такую кнопку с изменяющейся надписью, чтобы однин из возможных вариантов надписи
был виден в момент разработки?
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39094105
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодимирМожно на WFP написать такую кнопку с изменяющейся надписью, чтобы однин из возможных вариантов надписи
был виден в момент разработки?

Можно.
...
Рейтинг: 0 / 0
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
    #39094106
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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