powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / 1 элемент управления для нескольких строк
22 сообщений из 22, страница 1 из 1
1 элемент управления для нескольких строк
    #39612823
fgarfield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые форумчане!
Подскажите, как наиболее красиво решить такую задачу. Нужно привязать к элементу управления (допустим, TextBox) поле из таблицы БД (SQL Server) но только не для 1, а для несколько записей. То есть, программа выбирает n- записей по какому-либо признаку. Если значение в привязываемом поле у всех записей одинаковое, то в TextBox отображается это значение. Если хотя бы у одной записи оно отличается, то в TextBox отображается какие-нибудь символы (например, <...>). Соответственно, при внесении изменений в это TextBox значение этого поля должно изменяться для всех записей.
Хотелось узнать красивый способ для решения этой задачи. Наверняка, это распространенная задача (я часто встречал такие элементы в разном софте). Можно ли её решить с помощью Entity Framework? Хотелось бы получить подсказки именно по WPF, но для WinForms тоже буду рад. Пишу на C#.
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612844
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свой ValueConverter, который выполняет агрегацию любым удобным способом.
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612845
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fgarfieldНаверняка, это распространенная задача (я часто встречал такие элементы в разном софте).
Не распространенная. В гугле искали? Скрин сюда с гугла можем?
Если это comboBox выпадающий список то поищите на эти слова.
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612858
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fgarfield,

примерно так:
Код: 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.
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.
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Input;

namespace WpfApp1
{
    public class BaseModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public class Person : BaseModel
    {
        private string _name;
        private int _age;

        public Person(string name, int age)
        {
            _name = name;
            _age = age;
        }
        
        public string Name { get => _name; set { _name = value; OnPropertyChanged(nameof(Name)); } }

        public int Age { get => _age; set { _age = value; OnPropertyChanged(nameof(Age)); } }
    }

    public interface IGroup<T>
    {
        bool AllTheSome { get; }
        string Text { set; get; }
    }

    public class Group<T> : BaseModel, IGroup<T>
    {

        private readonly Func<T, string> _getValue;
        private readonly Action<T, string> _setValue;
        private readonly IEnumerable<T> _items;


        public Group(IEnumerable<T> items, Func<T, string> get, Action<T, string> set)
        {
            _items = items;
            _getValue = get;
            _setValue = set;

            GetValue();
        }

        private bool _allTheSome;
        public bool AllTheSome
        {
            private set
            {
                _allTheSome = value;
                OnPropertyChanged(nameof(AllTheSome));
            }
            get
            {
                return _allTheSome;
            }
        }

        private string _text;

        public string Text
        {
            get => _text;
            set
            {
                _text = value;
                SetValue(value);
                OnPropertyChanged(nameof(Text));
            }
        }

        private void GetValue()
        {
            var firstItem = _items.FirstOrDefault();
            if (firstItem != null)
            {
                var firstValue = _getValue(firstItem);
                AllTheSome = _items.All(p => string.Equals(_getValue(p), firstValue, StringComparison.Ordinal));

                if (AllTheSome)
                {
                    _text = firstValue;
                }
            }
            else
            {
                _text = null;
            }

            OnPropertyChanged(nameof(Text));
        }

        private void SetValue(string value)
        {
            foreach (var i in _items)
            {
                _setValue(i, value);
            }
        }
    }


    public class MainModel : BaseModel
    {
        private readonly Func<Person, string> _getName = p => p.Name;
        private readonly Action<Person, string> _setName = (p, v) => p.Name = v;
        private readonly Func<Person, string> _getAge = p => p.Age.ToString();
        private readonly Action<Person, string> _setAge = (p, v) => p.Age = Convert.ToInt32(v);
        private Group<Person> _names;
        private Group<Person> _ages;

        public List<Person> Persones { set; get; }

        public MainModel()
        {
            Persones = new List<Person>
            {
                new Person("User 1", 1),
                new Person("User 2", 2),
                new Person("User 2", 3),
                new Person("User 2", 4),
                new Person("User 3", 4),
                new Person("User 4", 4),
                new Person("User 5", 5)
            };
        }

        public Group<Person> Names { get => _names; private set { _names = value; OnPropertyChanged(nameof(Names)); } }
        public Group<Person> Ages { get => _ages; private set { _ages = value; OnPropertyChanged(nameof(Ages)); } }

        private ICommand _selctionChangedCommand;
        public ICommand SelctionChangedCommand { get => _selctionChangedCommand ?? (_selctionChangedCommand = new ActionCommand<IEnumerable>(SelectonChanged)); }

        private void SelectonChanged(IEnumerable items)
        {
            var persones = items.Cast<Person>();
            Names = new Group<Person>(persones, _getName, _setName);
            Ages = new Group<Person>(persones, _getAge, _setAge);
        }
    }

    public class ActionCommand<T> : ICommand
    {
        public event EventHandler CanExecuteChanged;

        private readonly Action<T> _action;

        public ActionCommand(Action<T> action)
        {
            _action = action;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            _action.Invoke((T)parameter);
        }
    }

}



Код: 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.
<Window x:Class="WpfApp1.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:WpfApp1"
        xmlns:view="clr-namespace:WpfApp1.View"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainModel/>
    </Window.DataContext>
    <Window.Resources>
        <Style TargetType="{x:Type ListBox}">
            <Setter Property="SelectionMode" Value="Multiple" />
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Margin" Value="3,3,3,0" />
        </Style>
  
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox Grid.Column="0" ItemsSource="{Binding Persones}" view:SelectedChangedNotify.Command="{Binding SelctionChangedCommand}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="{x:Type local:Person}">
                    <TextBlock>
                        <TextBlock.Inlines>
                            <Run Text="{Binding Name}" /> ,
                            <Run Text="{Binding Age}" />
                        </TextBlock.Inlines>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <StackPanel Grid.Column="1" >
            <TextBox Text="{Binding Names.Text}"/>
            <TextBox Text="{Binding Ages.Text}"/>
        </StackPanel>

    </Grid>
</Window>



Код: 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.
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApp1.View
{
    public static class SelectedChangedNotify
    {
        public static ICommand GetCommand(DependencyObject obj)
        {
            return (ICommand)obj.GetValue(CommandProperty);
        }

        public static void SetCommand(DependencyObject obj, ICommand value)
        {
            obj.SetValue(CommandProperty, value);
        }

        // Using a DependencyProperty as the backing store for Command.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CommandProperty =
            DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(SelectedChangedNotify), new PropertyMetadata(null, OnPropertyChanged));

        private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is ListBox listBox)
            {
                listBox.SelectionChanged += ListBox_SelectionChanged;
            }
        }

        private static void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is ListBox listBox)
            {
                var command = GetCommand(listBox);
                command.Execute(listBox.SelectedItems);
            }
        }
    }

}
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612861
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Я фигею. Это столько кода для контрола?
Каждый раз пишут?
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612862
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

очевидно, что это пример в который входит тестовая модель, всякие вспомогательные классы и прочее, что по факту уже будет, если работаешь с WPF постоянно, все это я из пальца только что высосал, ActionCommand или RelayCommand и связывание событий лучше взять из существующих сборок для шаблона MVVM, типа базовых моделей, команд и много другого. Да и пример кривенький )
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612864
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fgarfieldно для WinForms тоже буду рад.вот это имхо странно.
Под винФормс все стандартное в панели компонентов находится.
Под wpf совершенно другой подход.
Как тогда вам все равно на какой технологии решение?
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612866
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Спасибо. Ок.
Честно, я пока не врубился что вообще надо)))
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612868
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

вы сильно преувеличивайте, в реальных условиях в WPF У меня есть готовые комбики с мультиселектом и деревом, я их подключаю и делаю таким внешний вид, который подходит для текущего приложения. Конечно, готового решения нет, если самому делать лень, покупайте )
не помню, чтоб в WF был комбик аналогичный тому, про который я упомянул выше, но не уверен, не работаю с WF
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612874
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Мне интересен сабж т.к. у нас библиотека телерик для WPF.
И придётся скоро выбирать между вашим методом(своя lib) и готовым там.
Для этого нужно знать: "А что нужно ТСу"????
- что за аналогичный комбик? Мультиселект? Дерево тут причём?
...
Т.е. автор ищет комбоБокс с мультиселектом?
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612875
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор внятно сказал, что хочет ввести значение в текстбокс и оно должно записаться в поле во всех строках некой выборки. Причем тут мультиселект?
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612880
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProАвтор внятно сказал, что хочет ввести значение в текстбокс и оно должно записаться в поле во всех строках некой выборки. Причем тут мультиселект?
я внятно спрашиваю:
- это стандартный подход? Контрол?
Если да, то скрин плиз.
А накодировать я могу всё что угодно под заказ.
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612881
fgarfield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProСвой ValueConverter, который выполняет агрегацию любым удобным способом.
Вы имеете ввиду IValueConverter, метод ConvertBack ? Насколько я понял, этот метод использует 1 параметр, а вопрос именно в том, как привязать/применить это одно значение к нескольким записям

Petro123fgarfieldно для WinForms тоже буду рад.вот это имхо странно.
Под винФормс все стандартное в панели компонентов находится.
Под wpf совершенно другой подход.
Как тогда вам все равно на какой технологии решение?
Я совсем новичок в WPF, в то время как в WinForms более менее ориентируюсь. Хотелось начать разработку нового приложения именно в WPF. На я имел ввиду, что если кто-то поможет с WinForms, возможно, я подумаю, чтобы не выпендриваться и сделать его в старой доброй WinForms.:)

Roman Mejtes, Спасибо, постараюсь попробовать разобраться в Вашем коде...
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612888
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fgarfieldВы имеете ввиду IValueConverter, метод ConvertBack ? Насколько я понял, этот метод использует 1 параметр, а вопрос именно в том, как привязать/применить это одно значение к нескольким записямЯ имею ввиду конвертор в обе стороны. А привязываться надо не к каждой отдельной записи, а к свойству, представляющему набор записей. Впрочем, курите код Романа, там просто само свойство модели обеспечивает нужный функционал без конвертера.

Романпрокомментируешь как-нить подход 21241155 ? Может я не туда поехал?
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612891
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fgarfieldЯ совсем новичок в WPF, в то время как в WinForms более менее ориентируюсь. Хотелось начать разработку нового приложения именно в WPF. На я имел ввиду, что если кто-то поможет с WinForms, возможно, я подумаю, чтобы не выпендриваться и сделать его в старой доброй WinForms.:)
Я тоже в десктопе и бд ориентируюсь.
Трудно скрин привести?
автор Наверняка, это распространенная задача (я часто встречал такие элементы в разном софте).
Где они?
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612949
fgarfield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Трудно скрин привести?


Ну вот, например, панель свойств в любом CAD-е. На скрине Панель свойств Altium Designer. Внизу написано, что выбрано 53 элемента. Значение параметра Layer у них всех одинаковое, а например, параметр Х1 отличается хотя бы у одного из них, поэтому там нет значения. Если ввести в Х1 значение, оно применится ко всем 53 элементам.
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612950
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fgarfield,
Теперь понятно)
Property Grid или вертикальный грид такие штуки называются.
Да, если готового типа телерика нет, то руками много кода.
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39612987
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

платить за такую фигню?
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39613044
fgarfield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Спасибо за наводку! Попробую изучить
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39613080
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Виртуал грид руками, докирование руками, вертикальный руками...
Работодатель решил заплатить).
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39613085
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman Mejtes,
Виртуал грид руками, докирование руками, вертикальный руками...
Работодатель решил заплатить).

тут все делается через стандартную панель виртуализации, нужно просто наделать кучу шаблонов для разных типов данных, что самое приятное в WPF, это то, что добавлять новые будет на много проще. докирование конкретно к контролу отношение не имеет, за это отвечают контейнеры , что такое вертикальный я не понял, скролинг? вроде всё это идет из коробки.
все что нужно сделать, это шаблон и регулировку ширины колонки руками + иерархию или группы, сортировка, фильтрация все есть.
думаю легко сделать дня за 3 основательно и не платить деньги =)
уже делал их и не 1 раз, там всё банально и просто.
...
Рейтинг: 0 / 0
1 элемент управления для нескольких строк
    #39613179
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesтут все делается через стандартную панель виртуализации, нужно просто наделать кучу шаблонов для разных типов данных, что самое приятное в WPF, это то, что добавлять новые будет на много проще.
Не могу привыкнуть.
Мне как то больше по душе понятие компонент.
Если дельфи, то это пакет файл dpk. Если шарп, то это dll и визуальный контрол в палитре.
Тут в wpf с понятием шаблон как то разбросано всё. Но это имхо. Могу ошибаться.
...
Докирование это в телерике бросить контрол типа панели материнской куда и будет все прилипать докироваться.
...
Вертикальный это этот сабж. Разный тип не в колонках, а строках.
...
Да. Мне интересен ваш опыт. Видно что вы практик.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / 1 элемент управления для нескольких строк
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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