Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209

Использование MultiBinding и его функции

23.11.2019, 22:08. Показов 2877. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Пишу приложение для управления базой данных. И с клиента передаю несколько значений (каждое для своего столбца) и делаю это с помощью аргументов
C#
1
2
string UpdateDataNotice(string Order, string AdvanceNotice, string Designation, string Name,
           string ErrorCode, string ReasonsOfChange, string PhoneNumber, string Departament, string Surname);
Но мне не нравится что вылезает столько много аргументов. И ломаю голову как лучше и короче передавать данные и чтобы при изменении количества аргументов (ну если данных в таблице станет больше или меньше) не приходилось в куче текста разбираться.
Сейчас использую MultiBinding для передачи данных из View.
Выглядит вот так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Button Command="{Binding GetNotice}" Content="Обновить"  Height="54"  VerticalAlignment="Center" Margin="10" Grid.Row="5" Grid.Column="1" Padding="0">
            <Button.CommandParameter>
                <MultiBinding Converter="{StaticResource SimpleMultiConverter}">
                    <Binding ElementName="AdvanceNotice" Path="Text"/>
                    <Binding ElementName="Description" Path="Text"/>
                    <Binding ElementName="Name" Path="Text"/>
                    <Binding ElementName="DescriptionOfChanges" Path="Text"/>
                    <Binding ElementName="Phone" Path="Text"/>
                    <Binding ElementName="Departament" Path="Text"/>
                    <Binding ElementName="ReasonsOfChange" Path="SelectedItem"/>
                    <Binding ElementName="ProductType" Path="SelectedItem"/>
                </MultiBinding>
            </Button.CommandParameter>
        </Button>
И хочу узнать, можно ли как нибудь к этим binging'ам добавить что-то типа наименования?
Чтобы можно было допустим вывести информацию примерно так - Если имя переменной равно Имя, то вывести ее значение.

Надеюсь адекватно объяснил проблему.
Суть в том, что не хочется при редактировании <Binding ElementName.../> каждый раз приходилось бы во ViewModel менять и подстраивать данные, искать из массива object нужные и менять индексы.


В ViewModel ICommand у меня так выглядит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
GetNotice = new DelegateCommand<object[]>((arr) =>
                {
                    MessageBox.Show(arr[1].ToString());
                                    
                }
                
            }, arr => (
            arr?[1].ToString().Replace(" ", "") != "" &&
            arr?[2].ToString().Replace(" ", "") != "" &&
            arr?[3].ToString().Replace(" ", "") != "" &&
            arr?[4].ToString().Replace(" ", "") != "" &&
            arr?[5].ToString().Replace(" ", "") != "" && 
            arr?[6] != null &&
            arr?[7] != null));
Ну или какой нибудь другой способ передачи данных может порекомендуете?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.11.2019, 22:08
Ответы с готовыми решениями:

Возвращение результата функции bool и использование его в функции main()
У меня есть функция bool, которая имеет вид: bool Pisos(int row, int place) { if (...) return true; else return false;...

Передача массива в функцию и использование его внутри функции
Добрый день. Подскажите как реализовать следующее: Есть функция class kmvclass { public static string f_nnauth_get() { ...

Использование массива и его параметров из одной функции в другой
В одной функции был создан массив, присвоены значения. Затем некоторые элементы массива я попытался использовать в другой функции, но прога...

9
11 / 10 / 2
Регистрация: 17.11.2019
Сообщений: 17
23.11.2019, 22:36
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Надеюсь адекватно объяснил проблему.
это середина проблемы, без начала и без конца.
лучше бы код выложил
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
23.11.2019, 23:06  [ТС]
parser_light, а что еще выкладывать?
Есть окно с TextBox'ами, введенные данные в них передаются с помощью MultiBinding
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Сейчас использую MultiBinding для передачи данных из View.
Выглядит вот так
из View в ViewModel
Цитата Сообщение от Felix Felicis Посмотреть сообщение
В ViewModel ICommand у меня так выглядит
и там уже нужно красиво присвоить полученные данные. Да хоть чтобы в том же VM выводилось MessageBox с названием конкретного textbox (к примеру, Фамилия) и содержимого этой переменной (к примеру, Иванов).

Просто нужно уйти от индексов и быть завязанным на имени "переменных"
0
11 / 10 / 2
Регистрация: 17.11.2019
Сообщений: 17
24.11.2019, 02:09
1 класс данных
C#
1
2
3
4
5
6
  public class PersonEntity
    {
        public string Name { get; set; }
        public string Depart { get; set; }
        public string Phone { get; set; }
    }
2 ViewModel
C#
1
        public PersonEntity EditPerson { get; set; } = new PersonEntity( );
3 View
XML
1
2
3
4
5
6
        <StackPanel>
            <TextBox Text="{Binding EditPerson.Name }"/>
            <TextBox Text="{Binding EditPerson.Phone }"/>
            <TextBox Text="{Binding EditPerson.Depart }"/>
            <Button Command="{Binding ConfirmCommand}">confirm</Button>
        </StackPanel>
добавляй в PersonEntity и в View нужные свойства.
в обработчике команды ConfirmCommand будут в EditPerson все свойства по именам.
2
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
24.11.2019, 02:12  [ТС]
parser_light, так делал, но хочу сделать без лишних переменных и в мультибиндинге
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
24.11.2019, 11:42
Felix Felicis, здесь нужна несколько иная реализация.
Для передачи данных создаёте структуру.
Можно класс, но это зависит от требуемой функциональности.
Допустим, название типа ParamsStruct.

В созданном типе для каждого значения создаёте свойство.
Свойства можно объявить с "запасом".

В ресурсах выше элементов ввода и кнопок с командами объявляете экземпляр ParamsStruct. В области для ввода, в контейнере объединяющем элементы ввода устанавливаете на него контекст данных.
Элементы ввода привязываете к свойствам этого экземпляра.
В кнопке параметр команды привязываете к этому экземпляру.

В команде делаете приведение к этому типу и используете его свойства.

Ниже скину пример, но не быстро - пишу со смарта.
0
11 / 10 / 2
Регистрация: 17.11.2019
Сообщений: 17
24.11.2019, 12:36
Цитата Сообщение от Felix Felicis Посмотреть сообщение
выводилось MessageBox с названием конкретного textbox (к примеру, Фамилия) и содержимого этой переменной (к примеру, Иванов).
в чем проблема с моим кодом? Все там есть для получения имен и значений:
C#
1
2
3
4
5
6
7
  private void Confirm( object param )
        {
            string output = null;
            foreach ( PropertyInfo info in EditPerson.GetType( ).GetProperties( ) )
                output += info.Name + "=" + info.GetValue( EditPerson )+"\r\n";
            MessageBox.Show( output );
        }
это предельно простая схема. все можно добавить.
просто непонятен до конца полный алгоритм действий, которые вам нужны.
для каких-то особенностей в наименованиях можно добавлять свои аттрибуты
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
24.11.2019, 12:38
На базе примера от parser_light.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Window.Resources>
    <local:PersonEntity x:Key="PersonEntity"/>
    <DataTemplate DataType="{x:Type local:PersonEntity}"
                     x:Key="PersonEntity.Template.BD1"/>
          <StackPanel>
            <TextBox Text="{Binding Name }"/>
            <TextBox Text="{Binding Phone }"/>
            <TextBox Text="{Binding Depart }"/>
         </StackPanel>
    </DataTemplate>
<Window.Resources>
<StackPanel>
    <ContentPresenter Content="{StaticResource PersonEntity}"
                ContentTemplate="{StaticResource PersonEntity.Template.BD1"/>
    <Button Content="Добавить в первую базу"
          CommandParameter="{StaticResource PersonEntity}"
          Command="{Binding AddBD1Command}"/>
</StackPanel>

В VM команда и метод
C#
1
2
3
4
5
public RelayCommand AddBD1Command => ... new RelayCommand ( p=> AddBD1Metod((PersonEntity) p));
private void AddBD1Metod(PersonEntity person)
{
     // Здесь доступ к свойствам person
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
24.11.2019, 12:51
Цитата Сообщение от Felix Felicis
так делал, но хочу сделать без лишних переменных и в мультибиндинге
В мультибиндинге это не получится в принципе.
Мультибиндинг это универсальный тип. Он передаёт массив значений.
А значит нужно точное соответствие привязок индексам.

Теоретически вместо дефолтного MultiBinding можно сделать свой тип, который будет принимать не массив, а словарь.
Тогда можно будет привязку задать так
C#
1
2
3
4
<MultiBindingDict Converter="{StaticResource SimpleMultiConverter}">
     <Binding Key="Name" ElementName="Name" Path="Text"/>
     <Binding Key="Description" ElementName="Description" Path="Text"/>
</MultiBindingDict>
Но я сейчас без компа, и даже не знаю насколько это возможно.
1
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
24.11.2019, 15:55  [ТС]
Элд Хасп, тогда не буду трогать мультибиндинг, оставлю по дефолту, буду им пользоваться для выключения/отключения кнопок(ну типа когда все поля заполнены, то она будет кликабельна.
Использую тогда такой способ, который посоветовал товарищ parser_light.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2019, 15:55
Помогаю со студенческими работами здесь

Пересоздание массива в функции и дальнейшее его использование в main
Почему, когда я вызываю std::cout &lt;&lt; _list в функции, то вывод идет нормальный, а когда в main, то выводится не то, что нужно ? ...

Использование члена структуры как аргумента функции и его изменение
В учебнике Герберта Шилдта «C++. Полное руководство» написано как передавать член структуры в функцию как её аргумент, но почему-то не...

Использование таймера: вычисление значения функции и добавление его в Memo каждые три секунды
Здравствуйте у меня есть такая проблема: нужно составить программу, которая высчитывает значение функции y=x^2(квадрат) в отрезке с шагом...

MultiBinding
Это моя View. &lt;UserControl.Resources&gt; &lt;Class:BindingConverter x:Key=&quot;BindingConverter&quot;/&gt; &lt;/UserControl.Resources&gt; ...

Multibinding возвращает null
Всем привет. Есть привязка к ItemsSource. Простой Binding &lt;Binding XPath=&quot;Каталог/Группа&quot;&gt;. Всё ок, приходит IEnumerable&lt;XmlElement&gt;....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru