Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Не знаю возможно ли такое. Если да - подскажите как.
Примеры упрощённые для обучения.
Есть словарь с двумя определёнными списками
Dictionary1.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:local="clr-namespace:DataContent_на_XAML___Wpf_">
 
    <col:ArrayList x:Key="ListMonths">
        <sys:String>Январь</sys:String>
        <sys:String>Февраль</sys:String>
        <sys:String>Март</sys:String>
        <sys:String>Апрель</sys:String>
        <sys:String>Май</sys:String>
        <sys:String>Июнь</sys:String>
        <sys:String>Июль</sys:String>
        <sys:String>Август</sys:String>
        <sys:String>Сентябрь</sys:String>
        <sys:String>Октябрь</sys:String>
        <sys:String>Ноябрь</sys:String>
        <sys:String>Декабрь</sys:String>
 
    </col:ArrayList>
    <col:ArrayList x:Key="ListDays">
        <sys:String>Понедельник</sys:String>
        <sys:String>Вторник</sys:String>
        <sys:String>Среда</sys:String>
        <sys:String>Четверг</sys:String>
        <sys:String>Пятница</sys:String>
        <sys:String>Суббота</sys:String>
        <sys:String>Воскресенье</sys:String>
    </col:ArrayList>
 
</ResourceDictionary>

Окно с двумя ListBox ссылающимися на эти списки
<Window x:Class="DataContent_на_XAML___Wpf_.MainWindow"
        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:DataContent_на_XAML___Wpf_"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding Mode=OneWay, Source={StaticResource ListDays}}" HorizontalAlignment="Center" VerticalAlignment="Top"  Margin="10"/>
        <ListBox ItemsSource="{Binding Mode=OneWay, Source={StaticResource ListMonths}}" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10"/>
    </Grid>
</Window>

Можно ли это всё как-то переопределить - чтобы в DataContext окна сослаться на общий источник,
а потом в ListBox ссылаться только на имена списков. Что-то в таком духе (так не работает)
<Window x:Class="DataContent_на_XAML___Wpf_.MainWindow"
 .........
        DataContext="{Binding StaticResource}" ..... >
...........
        <ListBox ..... ItemsSource="{Binding  ListDays}"/>
        <ListBox ........ ItemsSource="{Binding  ListMonths}"/>
 ..........

То есть получить, что-то аналогичное ссылке на источник и потом привязке к его свойствам.
Суть в том, что хочу сделать несколько источников в словаре.
В первоначальном варианте, надо при переключении наборов данных перебивать все привязки ItemsSorce элементов.
Мне было бы гораздо удобнее, если изменить только в одном месте DataContext.
Естественно, интересует как сделать это в XAML без кода C# - в учебных целям.
24 сен 18, 11:07    [21683654]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Ну попробуйте запихнуть эти два массива еще в один массив и обращайтесь к элементам по индексу а в контексте переключайте сами массивы-хранилища.
Но в реальных приложениях так, конечно, не делают
24 сен 18, 11:24    [21683686]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro, спасибо за ответ!
Вы имеете ввиду записать в словаре следующим образом?
    <col:ArrayList x:Key="List1">

        <col:ArrayList x:Key="ListMonths">
            <sys:String>Январь</sys:String>
 ...........
        </col:ArrayList>
        <col:ArrayList x:Key="ListDays">
            <sys:String>Понедельник</sys:String>
 ............
       </col:ArrayList>
    </col:ArrayList>

НО указать ключи у вложенных элементов невозможно (или я не знаю как).
Если же их не указывать, то каким образом указать привязки в ItemsSorce ?
<Window x:Class= ................
     DataContext="{Binding Mode=OneWay, Source={StaticResource List1}}"
        ...............>
............
        <ListBox ItemsSource="{Binding ?????????}" ........./>
        <ListBox ItemsSource="{Binding ?????????}" ........./>
................
/Window>

Shocker.Pro
Но в реальных приложениях так, конечно, не делают
Да, согласен. Здесь цель несколько иная - учебная.
Допустим, при редактировании XAML окна - показываются элементы словаря (или другого XAML ресурса).
А в приложении привязка DataContext окна устанавливается на данные приложения.
24 сен 18, 12:00    [21683755]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Eld Hasp
НО указать ключи у вложенных элементов невозможно (или я не знаю как).
Если же их не указывать, то каким образом указать привязки в ItemsSorce ?
Я же написал - обращение по индексу. Типа Item[0]. Только надо повспоминать/погуглить, как там обратиться к элементу массива, если мы и так в контексте массива
24 сен 18, 12:07    [21683763]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Eld Hasp
Здесь цель несколько иная - учебная.

Раз цель учебная, то лучше запихнуть все данные в XML, и использовать XmlDataProvider. У списков, соответственно, будут просто разные XPath в биндингах. Это несколько полезнее с практической т.з.
24 сен 18, 12:11    [21683766]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro, я понял Вас об обращении по индексу. Но, насколько знаю, в XAML такое не возможно. Или я ошибаюсь?
Поэтому у Вас вторично, более конкретно, поинтересовался - "Что надо указать в привязке ItemsSource?"

Сон Веры Павловны, спасибо за внимание к моему вопросу.
Конечно можно сделать так
Файл DataXML.xml
<Data>
  <ListMonths>
    <Month>Январь</Month>
    <Month>Февраль</Month>
    ...........
  </ListMonths>
  <ListDays>
    <Day>Понедельник</Day>
    <Day>Вторник</Day>
    ..........
  </ListDays>
</Data>

XAML
    <Window.DataContext>
        <XmlDataProvider Source="DataXML.xml" XPath="Data" />
    </Window.DataContext>
    ..........
        <ListBox ItemsSource="{Binding  XPath=ListMonths/Month}" ........./>
        <ListBox ItemsSource="{Binding XPath=ListDays/Day}" ............/>
 ...........

Но использование XML - не решит данный вопрос так как мне хотелось бы.
Цели такие:
1. Имеется ли возможность это сделать средствами только XAML?
Может быть создать какой-нибудь дополнительный класс,
но чтобы он визуально отображался в XAML при редактировании?
Включая возможность изменения привязки DataContext из элемента WPF.
2. Если потом в приложении поменять Window.DataContext на источник с данными,
чтобы не пришлось менять привязки ItemsSource элементов окна.
С использованием XmlDataProvider привязки устанавливаются с помощью XPath,
а хотелось бы оставить их в виде {Binding Свойство}.
24 сен 18, 14:12    [21684017]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Eld Hasp
Но, насколько знаю, в XAML такое не возможно. Или я ошибаюсь?
ошибаетесь

Eld Hasp
Может быть создать какой-нибудь дополнительный класс,
но чтобы он визуально отображался в XAML при редактировании?
Это решение, которое напрашивается в качестве контейнера, но вы же сами запретили пользоваться C#
24 сен 18, 14:17    [21684031]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Shocker.Pro
Eld Hasp
Может быть создать какой-нибудь дополнительный класс,
но чтобы он визуально отображался в XAML при редактировании?
Это решение, которое напрашивается в качестве контейнера, но вы же сами запретили пользоваться C#
Это и будет MVVM, под это и заточен WPF
24 сен 18, 14:17    [21684034]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3167
в Binding можно использовать индексатор

ItemsSource="{Binding [0], Source={StaticResource MyRes}}"
ItemsSource="{Binding [1], Source={StaticResource MyRes}}"

<Window x:Class="WpfApp13.MainWindow"
        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:WpfApp13"
        xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <col:ArrayList x:Key="MyLists">
            <col:ArrayList>
                <sys:String>Январь</sys:String>
                <sys:String>Февраль</sys:String>
                <sys:String>Март</sys:String>
                <sys:String>Апрель</sys:String>
                <sys:String>Май</sys:String>
                <sys:String>Июнь</sys:String>
                <sys:String>Июль</sys:String>
                <sys:String>Август</sys:String>
                <sys:String>Сентябрь</sys:String>
                <sys:String>Октябрь</sys:String>
                <sys:String>Ноябрь</sys:String>
                <sys:String>Декабрь</sys:String>
            </col:ArrayList>
            <col:ArrayList>
                <sys:String>Понедельник</sys:String>
                <sys:String>Вторник</sys:String>
                <sys:String>Среда</sys:String>
                <sys:String>Четверг</sys:String>
                <sys:String>Пятница</sys:String>
                <sys:String>Суббота</sys:String>
                <sys:String>Воскресенье</sys:String>
            </col:ArrayList>
        </col:ArrayList>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding [0], Mode=OneWay, Source={StaticResource MyLists}}" HorizontalAlignment="Center" VerticalAlignment="Top"  Margin="10"/>
        <ListBox ItemsSource="{Binding [1], Mode=OneWay, Source={StaticResource MyLists}}" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10"/>
    </Grid>
</Window>


Думаю намекать на то, что индексатор может быть и строковым не нужно :)
24 сен 18, 14:53    [21684124]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Eld Hasp
1. Имеется ли возможность это сделать средствами только XAML?
Может быть создать какой-нибудь дополнительный класс,
но чтобы он визуально отображался в XAML при редактировании?

Разумеется:
<XmlDataProvider x:Key="XmlData">
  <x:XData>
    <root xmlns="">
      <MonthNames>
        <value>Январь</value>
        <value>Февраль</value>
        .............
        <value>Ноябрь</value>
        <value>Декабрь</value>
      </MonthNames>
      <DayNames>
        <value>Понедельник</value>
        <value>Вторник</value>
        .............
        <value>Суббота</value>
        <value>Воскресенье</value>
      </DayNames>
    </root>
  </x:XData>
</XmlDataProvider>

Eld Hasp
2. Если потом в приложении поменять Window.DataContext на источник с данными,
чтобы не пришлось менять привязки ItemsSource элементов окна.
С использованием XmlDataProvider привязки устанавливаются с помощью XPath,
а хотелось бы оставить их в виде {Binding Свойство}.

В такой постановке задача сводится к десериализации кастомного объекта из XAML-разметки. Вариантов здесь 2: 1) xml-данные от провайдера, как было показано выше, плюс десериализация в конвертере; 2) Писать свой объект, в XAML прописывать заполнение всех его свойств.

Пример:
1. Данные:
+
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows.Data;
using System.Xml;

namespace wpftest2
{
  public class MyWindowData
  {
    public MyWindowData()
    {
      MonthNames = new List<string>();
      DayNames = new List<string>();
    }

    public MyWindowData(XmlNode xdata)
    {
      var months = xdata.SelectNodes("/root/MonthNames/value/text()");
      MonthNames = months?.Cast<XmlText>().Select(n => n.Value).ToList();
      var days = xdata.SelectNodes("/root/DayNames/value/text()");
      DayNames = days?.Cast<XmlText>().Select(n => n.Value).ToList();
    }

    public List<string> MonthNames { get; }
    public List<string> DayNames { get; }
  }

  public class MyWindowDataConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      if (!(value is IList<XmlNode> list) || !list.Any()) return null;
      return new MyWindowData(list[0]);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }
}

2. Словарь с данными:
+
<ResourceDictionary
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:l="clr-namespace:wpftest2"
  xmlns:system="clr-namespace:System;assembly=mscorlib">

  <XmlDataProvider x:Key="XmlData">
    <x:XData>
      <root xmlns="">
        <MonthNames>
          <value>Январь</value>
          <value>Февраль</value>
          <value>Март</value>
          <value>Апрель</value>
          <value>Май</value>
          <value>Июнь</value>
          <value>Июль</value>
          <value>Август</value>
          <value>Сентябрь</value>
          <value>Октябрь</value>
          <value>Ноябрь</value>
          <value>Декабрь</value>
        </MonthNames>
        <DayNames>
          <value>Понедельник</value>
          <value>Вторник</value>
          <value>Среда</value>
          <value>Четверг</value>
          <value>Пятница</value>
          <value>Суббота</value>
          <value>Воскресенье</value>
        </DayNames>
      </root>
    </x:XData>
  </XmlDataProvider>

  <l:MyWindowData x:Key="MyWindowData">
    <l:MyWindowData.MonthNames>
      <system:String>Январь</system:String>
      <system:String>Февраль</system:String>
      <system:String>Март</system:String>
      <system:String>Апрель</system:String>
      <system:String>Май</system:String>
      <system:String>Июнь</system:String>
      <system:String>Июль</system:String>
      <system:String>Август</system:String>
      <system:String>Сентябрь</system:String>
      <system:String>Октябрь</system:String>
      <system:String>Ноябрь</system:String>
      <system:String>Декабрь</system:String>
    </l:MyWindowData.MonthNames>
    <l:MyWindowData.DayNames>
      <system:String>Понедельник</system:String>
      <system:String>Вторник</system:String>
      <system:String>Среда</system:String>
      <system:String>Четверг</system:String>
      <system:String>Пятница</system:String>
      <system:String>Суббота</system:String>
      <system:String>Воскресенье</system:String>
    </l:MyWindowData.DayNames>
  </l:MyWindowData>
</ResourceDictionary>

3. Фрагмент App.xaml:
+
<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="/wpftest2;component/XData.xaml" />
    </ResourceDictionary.MergedDictionaries>
    <wpftest2:MyWindowDataConverter x:Key="MyWindowDataConverter" />
  </ResourceDictionary>
</Application.Resources>

4. Разметка окна:
+
<Window
  x:Class="wpftest2.MainWindow"
  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"
  mc:Ignorable="d"
  WindowStartupLocation="CenterScreen"
  DataContext="{StaticResource MyWindowData}"
  Title="MainWindow" Height="350" Width="525">

  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <ListBox
      Margin="5"
      ItemsSource="{Binding MonthNames}" />
    <ListBox
      Grid.Column="1"
      Margin="5"
      ItemsSource="{Binding DayNames}" />
  </Grid>
</Window>

Соответственно, можно датаконтекст окна переключить на
DataContext="{Binding Source={StaticResource XmlData}, Converter={StaticResource MyWindowDataConverter}}"

Мне вариант с XML-десериализацией в конвертере нравится больше - выглядит изящнее, и дает возможность использовать десериализацию с помощью XmlSerializer (а для возможности автоматической десериализации объекта из XAML накладывается слишком много всяких ограничений - например, возврат конкретной реализации (List<T>) вместо интерфейса является следствием этих ограничений).
24 сен 18, 15:05    [21684155]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Roman Mejtes
Binding [0]
Вот прям так втупую path начинается с квадратной скобки?
Я просто сам поленился попробовать, но думал, что надо использовать что-то типа Item, потому что где-то мне приходилось его использовать, но не помню где.

Roman Mejtes
Думаю намекать на то, что индексатор может быть и строковым не нужно :)
А как это поможет (если на C# мораторий)? Использовать какой-то необобщенный словарь в качестве хранилища?
24 сен 18, 15:05    [21684156]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Это решение, которое напрашивается в качестве контейнера, но вы же сами запретили пользоваться C#
Я хочу избежать этого, если возможно.
И в любом случае, если создавать такой дополнительный класс, то надо чтобы он отображал свои значения во время редактирования XAML.
То есть создать класс, а объект (экземпляр) этого класс создать в XAML и там же присваивать ему значения.
Но я плохо владею этой частью. Так что - это смутные мысли по моему представлению.
Если можете - подскажите.

Roman Mejtes,
в Binding можно использовать индексатор
Спасибо!
Не знал. Подсказал Shocker.Pro - но я не понял как.
Пробовал указывать просто номер индекса, а что-то вариант указания со скобками в голову не пришёл.
Переделал так.
<Window x:Class=..............
        DataContext="{Binding Mode=OneWay, Source={StaticResource MyLists}}">
..............
        <ListBox ItemsSource="{Binding [0]}"  ...................../>
        <ListBox ItemsSource="{Binding [1]}" ................./>
.................
</Window>

Уже ближе к тому чего добиваюсь.
Но хотелось бы, если возможно, вариант с указанием ключей/свойств.
24 сен 18, 15:27    [21684199]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Eld Hasp
То есть создать класс, а объект (экземпляр) этого класс создать в XAML и там же присваивать ему значения.
Но я плохо владею этой частью. Так что - это смутные мысли по моему представлению.
Если можете - подскажите.

Выше же пример именно это и делает.
24 сен 18, 15:31    [21684202]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Сон Веры Павловны
В такой постановке задача сводится к десериализации кастомного объекта из XAML-разметки.
Если я правильно понял. То создать по объекту XML данные и их привязывать к DataContext.
Получится несколько наборов XML данных - для времени редактирования и исполнения. И возможность переключения между ними.
Я правильно понял?
24 сен 18, 15:35    [21684209]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Eld Hasp
И в любом случае, если создавать такой дополнительный класс, то надо чтобы он отображал свои значения во время редактирования XAML.
Зачем ему отображать СВОИ значения. Вы сделаете контейнер, а значения будете ЗАДАВАТЬ в XAML. Фактически заменить ArrayList на собственный контейнер, все остальное - то же самое.

По идее, можно попробовать с ListDictionary - задавать ключи с помощью x:Key, а обращаться к ним через индексатор. Тогда может прокатит без кода на C#
24 сен 18, 15:37    [21684213]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Сон Веры Павловны
Выше же пример именно это и делает.
Ещё не успел разобраться с ним - только смотрю.
24 сен 18, 15:38    [21684216]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Shocker.Pro
По идее, можно попробовать с ListDictionary - задавать ключи с помощью x:Key, а обращаться к ним через индексатор. Тогда может прокатит без кода на C#
типа так, как вы и хотели изначально
    <col:ListDictionary x:Key="List1">

        <col:ArrayList x:Key="ListMonths">
            <sys:String>Январь</sys:String>
 ...........
        </col:ArrayList>
        <col:ArrayList x:Key="ListDays">
            <sys:String>Понедельник</sys:String>
 ............
       </col:ArrayList>
    </col:ArrayList>
24 сен 18, 15:41    [21684220]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Зачем ему отображать СВОИ значения. Вы сделаете контейнер, а значения будете ЗАДАВАТЬ в XAML. Фактически заменить ArrayList на собственный контейнер, все остальное - то же самое.

По идее, можно попробовать с ListDictionary - задавать ключи с помощью x:Key, а обращаться к ним через индексатор. Тогда может прокатит без кода на C#
Очень смутно в этой части (как создать и использовать свой контейнер) соображаю. Поэтому и обратился за помощью.
Ключи во вложенных элементах ArrayList задать не получается, или я что-то не правильно делаю.
24 сен 18, 15:42    [21684221]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Eld Hasp
Очень смутно в этой части (как создать и использовать свой контейнер) соображаю. Поэтому и обратился за помощью.

обычный POCO класс с двумя коллекциями
public class MyContainer
{
  public List<string> ListMonths {get;set;}
  public List<string> ListDays {get;set;}
}
24 сен 18, 15:44    [21684227]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Eld Hasp
Ключи во вложенных элементах ArrayList задать не получается, или я что-то не правильно делаю.
Выше пример с ListDictionary, правда я не пробовал
24 сен 18, 15:45    [21684229]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
обычный POCO класс с двумя коллекциями ..............
А как его использовать в XAML?
Класс создал в локальном пространстве, но с префиксом local: его не видно.
24 сен 18, 15:53    [21684245]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
типа так, как вы и хотели изначально
    <col:ListDictionary x:Key="List1">

У меня на этой строчке ошибку выдаёт " Не удалось найти тип "col:ListDictionary"....".
Может какие-то ссылки подключить надо?
24 сен 18, 15:57    [21684254]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
У меня впечатление складывается, что вы не почитали литературу по WPF, а пытаетесь все делать методом тыка. Не получится. Освойте неймспейсы, чтобы аббревиатура xmlns не казалась вам абракадаброй
24 сен 18, 16:07    [21684277]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
...... чтобы аббревиатура xmlns не казалась вам абракадаброй
Не спорю - порой кажется.
Но в данном случае col у меня ссылается на "clr-namespace:System.Collections;assembly=mscorlib"
ArrayList из этого же пространства.
ListDictionary - из пространства System.Collections.Specialized. И по префиксу col - он не находится.
Поэтому не пойму, то ли я что-то не так делаю.
Толи ещё надо префиксы определить?
24 сен 18, 16:28    [21684325]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Eld Hasp
Shocker.Pro
обычный POCO класс с двумя коллекциями ..............
А как его использовать в XAML?
Класс создал в локальном пространстве, но с префиксом local: его не видно.

Сон Веры Павловны
Выше же пример именно это и делает.
24 сен 18, 16:34    [21684336]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Eld Hasp
ListDictionary - из пространства System.Collections.Specialized. И по префиксу col - он не находится.
Поэтому не пойму, то ли я что-то не так делаю.
Толи ещё надо префиксы определить?
Вы сами себе ответили. Только не надо называть пространства имен префиксами - вас не поймут.
24 сен 18, 16:49    [21684352]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Eld Hasp
ListDictionary - из пространства System.Collections.Specialized ....
Толи ещё надо префиксы определить?
Вы сами себе ответили. Только не надо называть пространства имен префиксами - вас не поймут.
Если б так просто всё было....
Может я конкретно туплю, не то делаю.
Я понимаю надо подключить пространство имён. Сделал так
xmlns:cols="clr-namespace:System.Collections.Specialized;assembly=mscorlib"
Но пространство не подключается. На строке <cols:ListDictionary x:Key="List1"> всё равно ошибка.
В коде, если указать using System.Collections.Specialized; тип ListDictionary появляется.
В XAML - ни как! По идее после <cols:, если нажать Ctrl+Пробел должен выйти список элементов. Тоже не выходит.
Ни как понять не могу, что не так делаю.
24 сен 18, 17:38    [21684425]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3167
Потому, что класс ListDictionary это класс сборки System, а не mscorlib

Неправильно:
clr-namespace:System.Collections.Specialized;assembly=mscorlib
Правильно:
clr-namespace:System.Collections.Specialized;assembly=System

пример:
<Window x:Class="WpfApp13.MainWindow"
        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:col="clr-namespace:System.Collections;assembly=mscorlib"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:spc="clr-namespace:System.Collections.Specialized;assembly=System"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <spc:ListDictionary x:Key="MyDict">
            <col:ArrayList x:Key="MyList1">
                <sys:String>Январь</sys:String>
                <sys:String>Февраль</sys:String>
                <sys:String>Март</sys:String>
                <sys:String>Апрель</sys:String>
                <sys:String>Май</sys:String>
                <sys:String>Июнь</sys:String>
                <sys:String>Июль</sys:String>
                <sys:String>Август</sys:String>
                <sys:String>Сентябрь</sys:String>
                <sys:String>Октябрь</sys:String>
                <sys:String>Ноябрь</sys:String>
                <sys:String>Декабрь</sys:String>
            </col:ArrayList>
            <col:ArrayList x:Key="MyList2">
                <sys:String>Понедельник</sys:String>
                <sys:String>Вторник</sys:String>
                <sys:String>Среда</sys:String>
                <sys:String>Четверг</sys:String>
                <sys:String>Пятница</sys:String>
                <sys:String>Суббота</sys:String>
                <sys:String>Воскресенье</sys:String>
            </col:ArrayList>
        </spc:ListDictionary>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding [MyList1], Mode=OneWay, Source={StaticResource MyDict}}" HorizontalAlignment="Center" VerticalAlignment="Top"  Margin="10"/>
        <ListBox ItemsSource="{Binding [MyList2], Mode=OneWay, Source={StaticResource MyDict}}" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10"/>
    </Grid>
</Window>
24 сен 18, 17:55    [21684446]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Roman Mejtes
Потому, что класс ListDictionary это класс сборки System, а не mscorlib
Неправильно:
clr-namespace:System.Collections.Specialized;assembly=mscorlib
Правильно:
clr-namespace:System.Collections.Specialized;assembly=System
Спасибо за внимание!
Теперь понял - заработало.

И подскажите, пожалуйста, чтобы в будущем таких ошибок не совершать, где и как можно посмотреть каких сборок классы?
System.Collections - mscorlib
System.Collections.Specialized - System
Погуглил - сам не нашёл такой информации.
25 сен 18, 18:47    [21685843]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3167
1. Встаете на объект или тип в C# Файле или на элемент в XAML, нажать F12 (дефолт)
открывается файл с метаданными типа, в 1 и 2 строке сразу видно, какая сборка (
2. Меню -> View -> Object Browser найти тип и посмотреть к какой сборке он относится.
3. Зайти на MSDN и посмотреть

#region Assembly PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\PresentationFramework.dll
#endregion

using System.Collections;
using System.ComponentModel;
using System.Windows.Automation.Peers;
using System.Windows.Controls.Primitives;
using System.Windows.Documents;
using System.Windows.Markup;

namespace System.Windows.Controls
{
    //
    // Summary:
    //     Represents a control that can be used to display or edit unformatted text.
    [ContentProperty("Text")]
    [Localizability(LocalizationCategory.Text)]
    public class TextBox : TextBoxBase, IAddChild, ITextBoxViewHost
    {
        //
        // Summary:
        //     Identifies the System.Windows.Controls.TextBox.TextWrapping dependency property.
        public static readonly DependencyProperty TextWrappingProperty;
        ...
}
25 сен 18, 18:56    [21685851]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
4. Поставить решарпер. Тогда вообще не придется неймспейсы указывать, написал ListDictionary, остальное решарпер сам найдет и допишет )
25 сен 18, 19:31    [21685893]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3167
Shocker.Pro
4. Поставить решарпер. Тогда вообще не придется неймспейсы указывать, написал ListDictionary, остальное решарпер сам найдет и допишет )
VS2017 умеет это без решарпера, но работает хер пойми как, в итоге я уже просто привык руками всё делать, да и нужно это только по большей части для своих\чужих контролов, и для типов модели представления, за 1 файл не больше 4-5 доп. НСов. Если их больше, то скорее всего файл скомпонован неверно.
25 сен 18, 20:16    [21685934]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro, Спасибо за совет! Обязательно воспользуюсь.
Извиняюсь за надоедливость, но будьте любезны, помогите разобраться с вариантом использования ListDictionary.
Как в ресурсах создать экземпляр этого класса и присвоить ему значения?
Я попробовал так
    <Window.Resources>
        <local:MyContainer>
            
        </local:MyContainer>
    </Window.Resources>

Но ситуация странная какая-то. После ввода local: имя класса MyContainer видно и предлагается его вставить. Но после его ставки выдаёт ошибку "Имя "MyContainer" не существует ...".
Пожалуйста, помогите осуществить и этот вариант.
25 сен 18, 21:30    [21685988]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Eld Hasp
разобраться с вариантом использования ListDictionary.
Eld Hasp
имя класса MyContainer видно и предлагается его вставить.
Не понял в итоге, с чем разобраться?

Eld Hasp
Но после его ставки выдаёт ошибку "Имя "MyContainer" не существует ...".
Скомпилируйте проект. Он просто не видит этого класса в dll-ке.
26 сен 18, 05:24    [21686153]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Roman Mejtes
1. Встаете на объект или тип в C# Файле или на элемент в XAML, нажать F12 (дефолт)
открывается файл с метаданными типа, в 1 и 2 строке сразу видно, какая сборка (
2. Меню -> View -> Object Browser найти тип и посмотреть к какой сборке он относится.
3. Зайти на MSDN и посмотреть

Я в последнее время вместо MSDN (что-то они вообще хардкорное сделали, в последниях версиях документации унаследованных мемберов можно увидеть только в базовом классе, где они определены) захожу сразу на https://referencesource.microsoft.com/ , и там из строки поиска сразу перехожу к нужному классу со всеми его потрохами.
26 сен 18, 05:58    [21686159]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Скомпилируйте проект. Он просто не видит этого класса в dll-ке.
Спасибо!
Причина действительно была в этом.
Ваш вариант с MyContainer - оказался самым удобным.
Ещё раз - Спасибо!
26 сен 18, 15:29    [21686889]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro, но теперь вылазеет ошибка при попытке исполнения во время инициализации элементов
XamlObjectWriterException: Свойство коллекции "DataContent_на_XAML___Wpf_.MyContainer"."ListDays" не определено (null).
В XAML окна сделал так:
<Window x:Class="DataContent_на_XAML___Wpf_.MainWindow"
................
    <Window.Resources>
        <local:MyContainer x:Key="MyContent">
            <local:MyContainer.ListDays>
                <sys:String>Понедельник</sys:String>
                <sys:String>Вторник</sys:String>
..................
           </local:MyContainer.ListDays>
            <local:MyContainer.ListMonths>
                <sys:String>Январь</sys:String>
                <sys:String>Февраль</sys:String>
.............................
            </local:MyContainer.ListMonths>
        </local:MyContainer>
    <Window.DataContext>
        <Binding Mode="OneWay" Source="{StaticResource MyContent}"/>
    </Window.DataContext>

    </Window.Resources>
.....................
        <ListBox ItemsSource="{Binding ListMonths}"  HorizontalAlignment="Center"  Margin="10"/>
        <ListBox ItemsSource="{Binding ListDays}" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10"/>
..............
</Window>
Ни каких ошибок при редактировании XAML нет.
26 сен 18, 15:47    [21686918]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Разобрался. Надо было списки в коде MyContainer инициализировать.
В таком варианте - всё заработало!
Спасибо!
26 сен 18, 15:51    [21686926]     Ответить | Цитировать Сообщить модератору
 Re: DataContent на XAML (WPF)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3167
почитай еще вот это:
https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.markup.iaddchild?redirectedfrom=MSDN&view=netframework-4.7.2
26 сен 18, 16:52    [21687056]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / WPF, Silverlight Ответить