Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Вопрос про Binding ItemsSource в ItemsControl

Разбираюсь с приложениями для Windows 8 в Visual Studio 2012 express for Windows 8.
Возникла такая ситуация, правда я не знаю возможно она ошибочная и так сделать нельзя. Поэтому хочу найти ответ на свой вопрос.
Вот например есть у меня класс:
      public class BorderItem
        {
            public string BorderName { get; set; }
            public string Color {get;set;}
        }


и есть ViewMode:

     public class MainViewModel : ViewModelBase
        {
            ObservableCollection<BorderItem> _BorderItems;
     
            public ObservableCollection<BorderItem> BorderItems
            {
                get { return _BorderItems; }
                set
                {
                    _BorderItems = value;
                    RaisePropertyChanged("BorderItems");
                }
            }
            int _WidthHeight = 150;
            public int WidthHeight
            {
                get { return _WidthHeight; }
                set
                {
                    _WidthHeight = value;
                    RaisePropertyChanged("WidthHeight");
                }
            }
            public MainViewModel(IDataService dataService)
            {
                BorderItems = new ObservableCollection<BorderItem>();
                //WidthHeight = 100;
                GetBorders();
            }
            void GetBorders()
            {
                //BorderItems.Clear();
                BorderItems.Add(new BorderItem() { AColor = "#e55115", BorderName = "A" });
                BorderItems.Add(new BorderItem() { AColor = "#e55115", BorderName = "B" });
                BorderItems.Add(new BorderItem() { AColor = "#e55115", BorderName = "C" });
                BorderItems.Add(new BorderItem() { AColor = "#e55115", BorderName = "D" });
                BorderItems.Add(new BorderItem() { AColor = "#e55115", BorderName = "E" });
            }
        }
    }


И все это привязывается в xaml:
     <common:LayoutAwarePage
     ....
     ....
     ....
     DataContext="{Binding Main, Source={StaticResource Locator}}">
     <Grid>
      <ItemsControl ItemsSource="{Binding BorderItems}" Margin="30,0,0,0">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapGrid  HorizontalChildrenAlignment="Left" VerticalChildrenAlignment="Center"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Border Background="{Binding AColor}" MinHeight="100"
                                    Height="{Binding Main.WidthHeight}" Width="{Binding Main.WidthHeight}" MinWidth="100" Margin="10,10,0,0" Tag="{Binding BorderName}"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
    </Grid>
    </common:LayoutAwarePage>


И вопрос, к ItemsSource="{Binding BorderItems}" все привязывается нормально, а вот как можно привязать WidthHeight из MainViewModel к свойствам элемента который находится внутри DataTemplate ?
Т.е. вот это Height="{Binding Main.WidthHeight}" Width="{Binding Main.WidthHeight}" не работает. Размер ставится по MinWidth. А хочется управлять размером отдельно.
Можно конечно добавить в BorderItem свойство отвечающее за размер, но тогда при изменении размера нужно будет перезаписывать заново весь BorderItems.
Можно ли такое вообще сделать? Хочу изменять значение всего одной переменной не затрагивая весь список.
Ответ:
Цитата IL_Agent @
попробуй явно указывать source в биндинге элемента коллекции
Height="{Binding Path = Main.WidthHeight, Source={StaticResource Locator}}"

так тоже не работает.

Хотя если я заменю ItemsControl, на GridView, то работает только если в массиве один элемент. Если элементов много, то не работает.
В ItemsControl хоть с одним, хоть с коллекцией элементов не работает.
Сообщение отредактировано: rodrigosan -
Вопрос: Вывод элементов ItemsControl в UserControl

Добрый день. Имеется UserControl с ItemsControl внутри, который в свою очередь привязан к своему внутреннему DependencyProperty(SourceCollection) для биндинга из вне.

UserControl1:
XML
1
2
3
<ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=SourceCollection}">
...
</ItemsControl>
Window:
XML
1
<control:UserControl1 SourceCollection="{Binding Collection}"/>
Привязка работает, но не смог разобраться, как передать из Window какие данные надо выводить в ItemsControl. Хочется сделать автономный и независимый UserControl, который ничего не знает о данных из вне, а может принимать ссылку на коллекцию и каким-то образом понимать какие данные выводить(предположим строковое представление свойства элемента коллекции Name), но каким?

P.S. Не получилось правильно сформировать запрос в гугле, поэтому решился поинтересоваться у родного комьюнити
Ответ: Используйте . Создайте у UserControl свойство DisplayMemberPath типа string и привяжитесь к нему
XML
1
2
3
4
<ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=SourceCollection}"
              DisplayMemberPath="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=DisplayMemberPath}">
 
</ItemsControl>
XML
1
<control:UserControl1 SourceCollection="{Binding Collection}" DisplayMemberPath="Name"/>
Вопрос: Как создать ItemsControl с заполнением в 2 колонки?

Нужен ItemsControl (ListBox, ListView), который состоял бы из 2-х колонок, заполняемых из ItemsSource слева направо сверху вниз. При изменение ширины окна ширина элементов изменяется соответствующим образом, изменение высоты окна на размер элементов внутри контрола влиять не должна. Переопределение ItemsPanelTemplate с заданием UniformGrid не подходит: он масштабирует элементы под заполнение всеми элементами всего пространства контрола. Если ItemsPanelTemplate переопределить на основе WrapPanel, то при увеличении размеров окна в листбоксе меняется количество колонок. А нужно примерно вот такое:

/

- но это я нарисовал, запихнув кнопки в грид, чисто для демонстрации желаемого. Какие тут возможны варианты?
Ответ: Отбой, разобрался. Решается всё тем же UniformGrid с указанием для него VerticalAlignment="Top", и с указанием для листбокса HorizontalContentAlignment="Stretch" - при таких свойствах всё работает как надо.
Вопрос: Узнать какой Item был выбран пользователем и перенести LabelName

Помогите пожалуйста, решит проблему...нужно узнать какой Item был выбран пользователем и перенести LabelName.Text выбранного Item в DishDetailName: TLabel (который лежит на другой странице) и потом перейти на эту страницу.
Код Delphi
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
unit Unit1;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListBox,
  FMX.Controls.Presentation, FMX.Edit, FMX.SearchBox, FMX.Layouts,
  FMX.TabControl, FMX.Objects, FMX.StdCtrls, FMX.ListView.Types, FMX.ListView,
  Data.DB, DBAccess, MyAccess, MemDS, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;
 
type
  TForm1 = class(TForm)
    TabControl1: TTabControl;
    TabItem1: TTabItem;
    TabItem2: TTabItem;
    TabItemDishDetail: TTabItem;
    ListBox1: TListBox;
    SearchBox1: TSearchBox;
    ListBox2: TListBox;
    Layout1: TLayout;
    Layout2: TLayout;
    Layout3: TLayout;
    DishDetailName: TLabel;
    Layout4: TLayout;
    DishDetailIcon: TImage;
    Layout5: TLayout;
    Layout6: TLayout;
    Layout7: TLayout;
    Layout8: TLayout;
    DishDetailIconPrice: TLabel;
    Button1: TButton;
    DishDetailСomposition: TText;
    TabItemKorzina: TTabItem;
    ListView1: TListView;
    MyConnection1: TMyConnection;
    MyQuery1: TMyQuery;
    IdHTTP1: TIdHTTP;
    SearchBox2: TSearchBox;
    procedure ListBox1Cick(Sender: TObject);
    procedure ListBox2Cick(Sender: TObject);
    procedure TabItem1Click(Sender: TObject);
 
  private
    { Private declarations }
  public
 
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.fmx}
 
 
 
 
procedure TForm1.TabItem1Click(Sender: TObject);
  begin
        MyConnection1.Connected:= true;
        MyQuery1.Active:=false;
        MyQuery1.SQL.Text:='select * from type';
        MyQuery1.Active:=true;
        ListBox1.Clear;
        while (not myQuery1.Eof) do
          begin
            ListBox1.Items.Add(MyQuery1.FieldByName('name_type').AsString);
            MyQuery1.Next;
          end;
  end;
 
 
 
procedure TForm1.ListBox1Cick(Sender: TObject);
var
  Item: TListBoxItem;
  ms: TMemoryStream;
  LayoutMain: TLayout;
  Icon: TImage;
  LayoutSP: TLayout;
  LayoutNP: TLayout;
  LayoutNPS: TLayout;
  LabelName: TLabel;
  LabelСomposition: TLabel;
  LabelPrice: TLabel;
begin
        ListBox2.Clear;
        MyQuery1.Active:=false;
        MyQuery1.SQL.Text:='select * from dish, type where type.id_type=dish.id_type and type.name_type= :parType';
        MyQuery1.Params.ParamByName('parType').Value:=ListBox1.Selected.Text;
        MyQuery1.Active:=true;
 
 
  ListBox2.BeginUpdate;
  Item:=TListBoxItem.Create(ListBox2);
  Item.Height:=90;
 
 
  while (not myQuery1.Eof) do
  begin
  IdHTTP1 := TIdHTTP.Create(Application);
  ms := TMemoryStream.Create;
  IdHTTP1.Get(MyQuery1.FieldByName('image').AsString , ms);
 
  LayoutMain:=TLayout.Create(Item);
  LayoutMain.Parent:=Item;
  with LayoutMain do
    begin
      Align:=TAlignLayout.Client;
    end;
 
  Icon:=TImage.Create(Item);
  Icon.Parent:=LayoutMain;
  with Icon do
    begin
       Icon.Align:=TAlignLayout.Left;
       Icon.Bitmap.LoadFromStream(ms);
       Icon.Width:=90;
       Icon.Height:=90;
    end;
 
  LayoutNPS:=TLayout.Create(Item);
  LayoutNPS.Parent:=LayoutMain;
  with LayoutNPS do
    begin
      LayoutNPS.Align:=TAlignLayout.Client;
    end;
 
  LayoutSP:=TLayout.Create(Item);
  LayoutSP.Parent:=LayoutNPS;
  with LayoutSP do
    begin
      LayoutSP.Align:=TAlignLayout.MostBottom;
    end;
 
  LabelName:=TLabel.Create(Item);
  LabelName.Parent:=LayoutNPS;
  with LabelName do
    begin
      LabelName.Align:=TAlignLayout.MostTop;
      LabelName.Text:=MyQuery1.FieldByName('name_dish').AsString;
      LabelName.AutoSize:=true;
    end;
 
 LabelСomposition:=TLabel.Create(Item);
  LabelСomposition.Parent:=LayoutSP;
  with LabelСomposition do
    begin
      LabelСomposition.Align:=TAlignLayout.Bottom;
      LabelСomposition.TextSettings.Font.Size:=5;
      LabelСomposition.Text:='Состав: ' + MyQuery1.FieldByName('struktyre').AsString;
    end;
 
  LabelPrice:=TLabel.Create(Item);
  LabelPrice.Parent:=LayoutSP;
  with LabelPrice do
    begin
      LabelPrice.Align:=TAlignLayout.MostRight;
      LabelPrice.TextSettings.Font.Size:=5;
      LabelPrice.TextSettings.VertAlign:=TTextAlign.Trailing;
      LabelPrice.Text:='Цена: ' + MyQuery1.FieldByName('Цена').AsString;
    end;
   ListBox2.AddObject(Item);
   MyQuery1.Next;
 
  end;
  ms.Free;
   IdHTTP1.Free;
  ListBox2.EndUpdate;
  TabControl1.Next();
 
end;
 
procedure TForm1.ListBox2Cick(Sender: TObject);
begin
  TabControl1.Next();
end;
 
end.
Ответ: чтобы обработать клик на Item а не на сам List
нужно при создании его присвоить ему обработчик
вот тут на 5:00 показано как

в обработчике
Код Delphi
1
2
3
4
5
var Item:TListBoxItem;
begin
  Item:=(Sender as TListBoxItem);
  ...
end;
Item Получили, далее используем FindComponent
в поиске найдете

возможно нужно было вообще поступить вот так:

полезное видео в целом, но я имею в виду 29:00 и далее
Вопрос: Из подмассива item вывести массив с самым большим значением ключа

Здраствуйте ребят, помогите решить пожалуйста задачку на PHP. Условие:
Дан массив

PHP
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
Array
(
    [item] => Array
        (
            [512] => Array
                (
                    [coords] => (50.451605, 30.525586900000008),
                    [map_zoom] => 16,
                    [name] => "магазин 1",
                    [address] => "адрес 1"
                ),
            [514] => Array
                (
                    [coords] => (53.261605, 33.525586900000008),
                    [map_zoom] => 8,
                    [name] => "магазин 3",
                    [address] => "адрес 3"
                ),
            [513] => Array
                (
                    [coords] => (55.171605, 39.525586900000008),
                    [map_zoom] => 8,
                    [name] => "магазин 2",
                    [address] => ""
                )
 
        )
 
    [item_default] => 512
)
НУжно:Из подмассива item вывести массив с самым большим значением ключа.
Ответ: Вероятно, так:
PHP
1
2
3
$arr = /*Ваш массив*/;
$max_key = max(array_keys($arr['item']));
print_r($arr['item'][$max_key]);
Вопрос: Отмена выделеного item

Добрый день. Создал простую прогу из 2 ListView, в них можно добавить элементы, удалить или перенести из одного в другой. Проблема заключается в том, что когда я вношу данные (рис 1) , затем выделяю нужную мне строку (рис 2), нажимаю на кнопку перенести(при этом item из одного листа удаляется и вставляется в другой) и ОН ОСТАЕТСЯ ВЫДЕЛЕНЫМ (рис 3), нет, вы не увидите что он выделен, этого не показывается визуально, но айтем все равно считается выделеным. И если нажать еще раз на кнопку "переместить" то эта строка вренется назад в предыдущий ListView хотя я его и не выделал(рис 4), он все равно считается выделеным. Для того чтобы он перестал выделяться нужно кликнуть по пустому месту в листе.

Подскажите пожалуйста как с этим бороться.
Ответ: Фарад, у меня такого не наблюдается. Вот код ниже.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication5 {
    public partial class Form1 : Form {
        int index = 0;
        public Form1() {
            InitializeComponent();
            btnAddLeft.Click += new EventHandler(btnAddLeft_Click);
            btnAddRight.Click += new EventHandler(btnAddRight_Click);
            btnLeftToRight.Click += new EventHandler(btnLeftToRight_Click);
            btnRightToLeft.Click += new EventHandler(btnRightToLeft_Click);
        }
 
        void btnRightToLeft_Click(object sender, EventArgs e) {
            if (listViewRight.SelectedItems != null && listViewRight.SelectedItems.Count != 0) {
                string item = listViewRight.SelectedItems[0].Text;
                listViewLeft.Items.Add(item.ToString());
                listViewRight.Items.RemoveAt(listViewRight.SelectedIndices[0]);
            }
        }
 
        void btnLeftToRight_Click(object sender, EventArgs e) {
            if (listViewLeft.SelectedItems != null && listViewLeft.SelectedItems.Count != 0) {
                string item = listViewLeft.SelectedItems[0].Text;
                listViewRight.Items.Add(item.ToString());
                listViewLeft.Items.RemoveAt(listViewLeft.SelectedIndices[0]);
            }
        }
 
        void btnAddRight_Click(object sender, EventArgs e) {
            listViewRight.Items.Add(index.ToString());
            index++;
        }
 
        void btnAddLeft_Click(object sender, EventArgs e) {
            listViewLeft.Items.Add(index.ToString());
            index++;
        }
    }
}
Вопрос: Обращение к определенному Item-y в ListView

Всем доброго времени суток. Итак, суть проблемы: есть ListView, который динамически из БД заполняется значениями, у каждого Item-a есть пару кнопок и текстбокс. Кнопки запускают методы, полученное значение нужно вывести в текстбокс соответствующего item-a. Примеров с подобной ситуацией (приблизительно хотя бы) ни где не нашел. Как это сделать?
Ответ: Дабы не создавать новую тему, спрошу здесь.
На днях нашёл хорошее решение, как биндить команду к нажатию кликом мышки на item listview. Решение нашёл .
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<ListView ItemsSource="{Binding Model.TablesView}"   Grid.Row="1" 
              SelectedItem="{Binding Model.SelectedTable, Mode=TwoWay}"  >
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=.}" 
                   Width="{Binding Path=ActualWidth, 
                             RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
                    <TextBlock.InputBindings>
                        <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DataContext.MoveItemRightCommand,
                                        RelativeSource={RelativeSource FindAncestor, 
                                        AncestorType={x:Type UserControl}}}"
                                      CommandParameter="{Binding .}"/>
                    </TextBlock.InputBindings>
                </TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
Решение хорошее, но мне нужен не DoubleClick, а одинарный клик. Я поставил вместо ="LeftDoubleClick" - "LeftClick", но при таком варианте не обводится выбранный item. Обводится, если делать DoubleClick. Кто-нибудь сможет сказать, как сделать, чтоб и команда срабатывала и выбранный item обводился при одиночном клике?
Вопрос: TreeView как получить данные о Selected Item

Как определить какой из элементов пользователь выбрал. Т.е. мне надо получить ID элемента и его тип (ObjectTypes), чтобы знать с каким из объектов работает пользователь


+ Класс коллекции и DataTemplateSelector
public class ConstructionViewModel
{
	public int ID { get; set; }
	public ObjectTypes ObjectType { get; set; }
	public string Name { get; set; }

	public ConstructionViewModel(int myID, ObjectTypes myType, string myName)
	{
		ID = myID;
		ObjectType = myType;
		Name = myName;
		Members = new ObservableCollection<ConstructionViewModel>();
	}
	public ObservableCollection<ConstructionViewModel> Members { get; set; }
}
public enum ObjectTypes
{
	ContructionObject = 1,
	ContructionStructure = 2,
	ActStructure = 4,
	ActWork = 8
}

public class ConstructionObjectTemplateSelector : DataTemplateSelector
{

	public DataTemplate ConstractionTemplate { get; set; }
	public DataTemplate StructureTemplate { get; set; }
	public DataTemplate ActStructureTemplate { get; set; }
	public DataTemplate ActWorkTemplate { get; set; }

	public override DataTemplate SelectTemplate(object item, DependencyObject container)
	{

		dynamic obj = (ConstructionViewModel)item;
		switch (obj.ObjectType) {
			case ObjectTypes.ContructionObject:
				return ConstractionTemplate;
			case ObjectTypes.ContructionStructure:
				return StructureTemplate;
			case ObjectTypes.ActStructure:
				return ActStructureTemplate;
			case ObjectTypes.ActWork:
				return ActWorkTemplate;
			default:
				return null;
		}
	}
}
+ Набор данных и привязка

ObservableCollection<ConstructionViewModel> myObjects = new ObservableCollection<ConstructionViewModel>();

ConstructionViewModel act1 = new ConstructionViewModel(1, 8, "Act 1");
ConstructionViewModel act2 = new ConstructionViewModel(2, 8, "Act 2");
ConstructionViewModel act3 = new ConstructionViewModel(3, 8, "Act 3");
ConstructionViewModel act4 = new ConstructionViewModel(4, 4, "Act 4");

ConstructionViewModel structure1 = new ConstructionViewModel(1, 2, "Structure 1");
ConstructionViewModel structure2 = new ConstructionViewModel(2, 2, "Structure 2");

ConstructionViewModel subStructure1 = new ConstructionViewModel(3, 2, "Sub Structure 1");
ConstructionViewModel subStructure2 = new ConstructionViewModel(4, 2, "Sub Structure 2");
ConstructionViewModel subStructure3 = new ConstructionViewModel(5, 2, "Sub Structure 3");
ConstructionViewModel subStructure4 = new ConstructionViewModel(6, 2, "Sub Structure 4");

ConstructionViewModel construction1 = new ConstructionViewModel(1, 1, "Construction 1");
ConstructionViewModel construction2 = new ConstructionViewModel(2, 1, "Construction 2");


subStructure4.Members.Add(act1);
subStructure4.Members.Add(act2);
subStructure4.Members.Add(act4);

subStructure3.Members.Add(subStructure4);

subStructure1.Members.Add(subStructure2);
subStructure1.Members.Add(subStructure3);

structure1.Members.Add(subStructure1);
structure2.Members.Add(act3);

construction1.Members.Add(structure1);
construction1.Members.Add(structure2);

myObjects.Add(construction1);
myObjects.Add(construction2);

treeObjects.ItemsSource = myObjects;
+ XAML
    <Window.Resources>
        <HierarchicalDataTemplate x:Key="constractionTemplate" ItemsSource="{Binding Members}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" />
                <TextBlock Text=" [" Foreground="Blue" />
                <TextBlock Text="{Binding Members.Count}" Foreground="Blue" />
                <TextBlock Text="]" Foreground="Blue" />
            </StackPanel>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate x:Key="structureTemplate" ItemsSource="{Binding Members}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>

        <DataTemplate x:Key="actStructureTemplate">
            <TextBlock Text="{Binding Name}" Foreground="DarkGreen"/>
        </DataTemplate>

        <DataTemplate x:Key="actWorkTemplate">
            <TextBlock Text="{Binding Name}" Foreground="DarkMagenta"/>
        </DataTemplate>

        <local:ConstructionObjectTemplateSelector x:Key="ConstructionObjectTemplateSelector"
                            ConstractionTemplate="{StaticResource constractionTemplate}"
                            StructureTemplate="{StaticResource structureTemplate}"
                            ActStructureTemplate="{StaticResource actStructureTemplate}"
                            ActWorkTemplate="{StaticResource actWorkTemplate}" />
    </Window.Resources>
    <Grid>
        <TreeView x:Name="treeObjects" ItemTemplateSelector="{StaticResource ConstructionObjectTemplateSelector}" />
    </Grid>
Ответ: Как оказалось, проблем вообще нет...
Пост закрыт
Вопрос: Зависимость размеров Item

Доброго времени суток.

В окошке имеются 2 контрола (лежат в разных файлах).
В каждом контроле есть контейнер - в 1-м контроле - ItemsControl, который представляет коллекцию string, во 2-м - ListBox, который представляет коллекцию из экземпляров моего класса, в котором есть bool поле, которое, опять-таки, в каждой строке ListBoxItem представляется с помощью ItemsControl.

По клику у меня добавляются объекты в коллекцию - в ItemsContol.
Добавляется string в 1й и CheckBox во 2-й. (На скриншоте более понятнее).

Мне необходимо сделать так, чтобы каждый элемент был равен по ширине, т.е. при добавлении визуально нового объекта эти 2 объекта в разных контейнерах визуально "находились как бы в одной колонке".

DataGrid использовать не могу.

Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<UserControl.Resources>
        <DataTemplate x:Key="DatesTemplate">
            <TextBlock Width="30" Margin="5,0,5,0" Text="{Binding Mode=OneWay}"></TextBlock>
        </DataTemplate>
    </UserControl.Resources>
 
<ItemsControl Grid.Row="5" Grid.Column="2"
                      ItemsSource="{Binding Dates}" ItemTemplate="{StaticResource DatesTemplate}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
 <UserControl.Resources>
        <DataTemplate x:Key="myCollectionItems">
            <CheckBox Width="33" Margin="5,0,0,0" IsChecked="{Binding Path=Val, Mode=TwoWay}" IsEnabled="{Binding Path=Enabled}"/>
        </DataTemplate>
    </UserControl.Resources>
 
<ItemsControl Margin="20,0,0,0" ItemsSource="{Binding Attendance}" ItemTemplate="{StaticResource myCollectionItems}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>

Пробовал задавать одинаковые значения ширины и Margin - не помогло. В начале текст (1й ItemsControl) немного левее смещен, потом по центру (идеальное положение, "будто в одну колонку"), потом вправо уходит смещение.

Подскажите, пожалуйста.

А, самое главное - Текст может быть не только Запись 1 - может быть длинный текст (например в 3 слова)
Ответ: Или же стоит выставить Margin и ограничить пользователя в выборе строк для 1 столбца?

Любой совет.
Вопрос: Обновление суммы в группе ItemsControl'a

привет всем,

есть некая коллекция объектов с полем типа дабл. эта коллекция отображается в ItemsControl:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<ItemsControl ItemsSource="{Binding MyCollection}">
    <ItemsControl.GroupStyle>
        <GroupStyle>
             <GroupStyle.HeaderTemplate>
                  <DataTemplate>
                      <TextBlock Text="{Binding Items, Converter={StaticResource AverageConverter}}"
                  </DataTemplate>
             <GroupStyle.HeaderTemplate>
       <GroupStyle>
    </ItemsControl.GroupStyle>
    <ItemsControl.ItemTemplate>
         <DataTemplate> 
              <TextBox Text="{Binding MyValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
         </DataTemplate>
    <ItemsControl.ItemTemplate>
<ItemsControl>
смысл в том, что коллекция группируется по некоему полю. В заголовке группы отображается среднее арифметическое значений группы. это происходит в конвертере.

хочу, чтобы при изменении какого-то значения группы автоматически изменялось и среднее арифметическое в заголовке группы..
C#
1
CollectionViewSource.GetDefaultView(MyCollection).Refresh();
при таком обновлении вью, теряется фокус из моего текстбокса. приходится снова кликать и изменять значение, если не изменил.. как быть?

Добавлено через 45 минут
за неимением лучшего решения сделал так:

1. создал свойство в модели, которое будет передаваться в конвертер параллельно с значениями группы.
2. конвертер изменил на мультиконвертер

изменяю это свойство при изменении любого значения в текстбоксе. таким образом заставляю конвертер пересчитать среднее арифметическое
Ответ: ViterAlex,

ну идею я понял, спасибо, но в данном случае среднее арифметическое отображается просто для удобства пользователя, поэтому я не стал заморачиваться.