Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Привязка ListBox к ресурсам страницы с использованием ItemTemplate / 13 сообщений из 13, страница 1 из 1
15.10.2015, 21:25
    #39078095
Володимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Код примера простой, ошибок нет, но не работает.
Пытался я найти работающий пример в интернет либо 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
16.10.2015, 09:07
    #39078264
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Код: 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
16.10.2015, 09:09
    #39078268
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Код: 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
16.10.2015, 10:51
    #39078354
Володимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Спасибо, замечательно работает всё.
...
Рейтинг: 0 / 0
27.10.2015, 09:50
    #39087640
Володимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Всё работает, только непонятно, зачем нужен код
Код: 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
27.10.2015, 10:08
    #39087661
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
ВолодимирВсё работает, только непонятно, зачем нужен код
Код: 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
29.10.2015, 12:45
    #39089907
Володимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Я попробовал предложенный вариант

Работает, но получилось значительно сложнее
А именно, вместо одной короткой строчки пришлось написат 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
29.10.2015, 13:26
    #39089980
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
просто для WPF нужно использовать MVVM шаблон, а не вот "это" и проблем не будет вообще
...
Рейтинг: 0 / 0
29.10.2015, 14:44
    #39090115
Володимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Хороший совет, но хотелось бы примерчик MVVM попроще
...
Рейтинг: 0 / 0
02.11.2015, 09:29
    #39092394
Володимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
У меня задача оказалась чуть сложнее
Надо чтобы в поле метки при редактировании страницы было написано "не выбрано"
(Точнее мне это надо сделать с кнопками, но в обсуждаемом примере кнопок нет, но это ведь всё равно, кнопка или метка)
Но поскольку значение отображаемое в метке вычисляется после запуска програмы, на этапе разработки никакой надписи нет.
То есть, все кнопки у меня слепые в момент разработки, что очень неудобно.
Я не нашёл пока способа это исправить, потому что привязать Content к двум разным источника нельзя.
...
Рейтинг: 0 / 0
02.11.2015, 15:01
    #39092830
Володимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
Если надпись на кнопке привязана к свойству страницы, то в дизайнере этой надписи не видно
(кнопка слепая - просто квадратик), надпись же проявляется только после запуска программы.
Можно на WFP написать такую кнопку с изменяющейся надписью, чтобы однин из возможных вариантов надписи
был виден в момент разработки?
...
Рейтинг: 0 / 0
03.11.2015, 21:40
    #39094105
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Привязка ListBox к ресурсам страницы с использованием ItemTemplate
ВолодимирМожно на WFP написать такую кнопку с изменяющейся надписью, чтобы однин из возможных вариантов надписи
был виден в момент разработки?

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


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