Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2021, 13:20   #1
eliasum
Пользователь
 
Регистрация: 12.02.2015
Сообщений: 31
По умолчанию Почему неправильно работает CheckComboBox?

В коде XAML формируется таблица, во второй колонке в каждой ячейке содержится контрол CheckComboBox из WPF Toolkit:
Код:
<GroupBox Header="{Binding XPath='@description'}"
                  HorizontalAlignment="Center">

        <DataGrid ItemsSource="{Binding XPath='Item'}" AutoGenerateColumns="False" Margin="0,5,0,0">
            
            <DataGrid.Columns>

                <DataGridTextColumn Binding="{Binding XPath='@key'}">

                    <DataGridTextColumn.Header>

                        <TextBlock Text="{Binding XPath='@title'}"
                                       DataContextChanged="header_DataContextChanged"/>
                    </DataGridTextColumn.Header>

                </DataGridTextColumn>

                <DataGridTemplateColumn>

                    <DataGridTemplateColumn.CellTemplate>

                        <DataTemplate>

                            <toolkit:CheckComboBox HorizontalAlignment="Center" 
                                                   VerticalAlignment="Center" 
                                                   DataContextChanged="CheckComboBox_DataContextChanged"
                                                   ItemsSource="{Binding XPath='//Defect/Type/Item/@title'}" 
                                                   Delimiter=";"
                                                   />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>

        </DataGrid>

    </GroupBox>
</UserControl>
Код C#:

Код:
private void header_DataContextChanged(object sender,
            DependencyPropertyChangedEventArgs e)
        {
            if (e.OldValue == null)
                ((TextBlock)sender).DataContext = this.DataContext;
        }

        private void CheckComboBox_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            Xceed.Wpf.Toolkit.CheckComboBox control =
                (Xceed.Wpf.Toolkit.CheckComboBox)sender;

            if (e.OldValue == null)
            {
                control.DataContext = this.DataContext;
            }
        }
При выборе одного из CheckComboBox и выбирая нужные данные, в текст CheckComboBox заносятся названия объектов атрибутов (System.Xml.XmlAttribyte) вместо имен (Настройка00, ..., Настройка09), а так же при выборе другого CheckComboBox в предыдущем не сохраняется выбор. Как это исправить?

Без имени.png
eliasum вне форума Ответить с цитированием
Старый 19.08.2021, 15:22   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Ну свяжите с текстовым полем. Или у класса переопределите метод ToString().
Сходу то из вашего фрагмента кода не совсем понятно откуда ноги растут.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 23.08.2021, 09:29   #3
eliasum
Пользователь
 
Регистрация: 12.02.2015
Сообщений: 31
По умолчанию

есть UserControl, код XAML:

Код:
<UserControl x:Class="CheckComboBoxControlLibrary.CheckComboBoxControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:toolkit="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
             mc:Ignorable="d">
 
    <GroupBox Header="{Binding XPath='Settings/Resume/@description'}"
                  HorizontalAlignment="Center">
 
        <DataGrid ItemsSource="{Binding XPath='Settings/Slot/Item'}" AutoGenerateColumns="False" Margin="0,5,0,0">
            
            <DataGrid.Columns>
 
                <DataGridTextColumn Binding="{Binding XPath='@key'}">
 
                    <DataGridTextColumn.Header>
 
                        <TextBlock Text="{Binding XPath='Settings/Slot/@title'}"
                                       DataContextChanged="header_DataContextChanged"/>
                    </DataGridTextColumn.Header>
 
                </DataGridTextColumn>
 
                <DataGridTemplateColumn>
 
                    <DataGridTemplateColumn.CellTemplate>
 
                        <DataTemplate>
 
                            <toolkit:CheckComboBox HorizontalAlignment="Center" 
                                                   VerticalAlignment="Center" 
                                                   ItemsSource="{Binding XPath='//Defect/Type/Item/@title'}"
                                                   Delimiter=";"
                                                   />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
 
            </DataGrid.Columns>
 
        </DataGrid>
 
    </GroupBox>
</UserControl>
Code-behind этого UserControl:

Код:
using System.Windows;
using System.Windows.Controls;
 
namespace CheckComboBoxControlLibrary
{
    /// <summary>
    /// Логика взаимодействия для CheckComboBoxControl.xaml
    /// </summary>
    public partial class CheckComboBoxControl : UserControl
    {
        public CheckComboBoxControl()
        {
            InitializeComponent();
        }
 
        private void header_DataContextChanged(object sender,
            DependencyPropertyChangedEventArgs e)
        {
            if (e.OldValue == null)
                ((TextBlock)sender).DataContext = this.DataContext;
        }
 
        private void CheckComboBox_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            Xceed.Wpf.Toolkit.CheckComboBox control =
                (Xceed.Wpf.Toolkit.CheckComboBox)sender;
 
            if (e.OldValue == null)
            {
                control.DataContext = this.DataContext;
            }
        }
    }
}
В этом же решении небольшой проект проверки работоспособности UserControl, код XAML c XML-данными в DataContext:
eliasum вне форума Ответить с цитированием
Старый 23.08.2021, 09:30   #4
eliasum
Пользователь
 
Регистрация: 12.02.2015
Сообщений: 31
По умолчанию

Код:
<Window
        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:CheckComboBoxControlUsing"
        xmlns:control="clr-namespace:CheckComboBoxControlLibrary;assembly=CheckComboBoxControlLibrary" 
        x:Class="CheckComboBoxControlUsing.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow">
 
    <Window.DataContext>
        <XmlDataProvider IsInitialLoadEnabled="True" IsAsynchronous="False">
            <x:XData>
                <Product xmlns="" title="Проверяемое изделие">
                    <Settings title="Изделие">
                        <Defect title="Дефект" description="Дефект изделия">
                            <Type title="Тип" description="Тип дефекта">
                                <Item key="01" title="Настройка00"/>
                                <Item key="02" title="Настройка01"/>
                                <Item key="03" title="Настройка02"/>
                                <Item key="04" title="Настройка03"/>
                                <Item key="05" title="Настройка04"/>
                                <Item key="06" title="Настройка05"/>
                                <Item key="07" title="Настройка06"/>
                                <Item key="08" title="Настройка07"/>
                                <Item key="09" title="Настройка08"/>
                                <Item key="10" title="Настройка09"/>
                            </Type>
                        </Defect>
                        <Resume title="" description="Группа">
                        </Resume>
                        <Slot title="Позиция" description="Позиция изделия" number="№ УЛ">
                            <Item key="01">
                                <Defect>
                                    <!--Item key="2" />
                                    <   Item key="7" />
                                    <   Item key="11"/-->
                                </Defect>
                            </Item>
                            <Item key="02">
                                <Defect></Defect>
                            </Item>
                            <Item key="03">
                                <Defect></Defect>
                            </Item>
                            <Item key="04">
                                <Defect></Defect>
                            </Item>
                            <Item key="05">
                                <Defect></Defect>
                            </Item>
                            <Item key="06">
                                <Defect></Defect>
                            </Item>
                            <Item key="07">
                                <Defect></Defect>
                            </Item>
                            <Item key="08">
                                <Defect></Defect>
                            </Item>
                            <Item key="09">
                                <Defect></Defect>
                            </Item>
                            <Item key="10">
                                <Defect></Defect>
                            </Item>
                            <Item key="11">
                                <Defect></Defect>
                            </Item>
                            <Item key="12">
                                <Defect></Defect>
                            </Item>
                            <Item key="13">
                                <Defect></Defect>
                            </Item>
                            <Item key="14">
                                <Defect></Defect>
                            </Item>
                            <Item key="15">
                                <Defect></Defect>
                            </Item>
                            <Item key="16">
                                <Defect></Defect>
                            </Item>
                            <Item key="17">
                                <Defect></Defect>
                            </Item>
                            <Item key="18">
                                <Defect></Defect>
                            </Item>
                        </Slot>
                    </Settings>
                </Product>
            </x:XData>
        </XmlDataProvider>
    </Window.DataContext>
 
    <Grid>
 
        <control:CheckComboBoxControl DataContext="{Binding XPath='Product'}"
                                    HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>
DataGrid формирует таблицу, в первом столбце выводятся значения атрибутов Slot/Item/@key, а во втором столбце в каждой ячейке находится CheckComboBox, в который выводится список атрибутов - Defect/Type/Item/@title, но вместо названия атрибута выводится его тип.

Для каждого значения Slot/Item/@key в первом столбце набор из Defect/Type/Item/@title во втором столбце.

По поводу хранения данных: набор из Defect/Type/Item/@title во втором столбце должен храниться как набор тегов в Slot/Item/Defect/..., например для Item c key="01":

Код:
                        <Slot title="Позиция" description="Позиция изделия">
                            <Item key="01">
                                <Defect>
                                    <!--Item key="2" />
                                    <   Item key="7" />
                                    <   Item key="11"/-->
                                </Defect>
                            </Item>
...............
eliasum вне форума Ответить с цитированием
Старый 23.08.2021, 13:56   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

а... стало еще хуже.

Нужен какой то более простой пример шаблона прежде чем его так раздувать.
Вообще если у вас связь с каким то классом то нужно прописать связь по полям с TypeConverter.
Само по себе ничего в класс сохранятся не будет.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите почему работает неправильно [большие числа] bylbyl9tor Помощь студентам 1 06.12.2018 15:34
почему неправильно? Tolian92 Паскаль, Turbo Pascal, PascalABC.NET 0 27.03.2012 02:04
объясните пожалйуста почему if работает неправильно ImmortalAlexSan Общие вопросы C/C++ 8 11.02.2011 10:33
почему на чужем ПК неправильно работает программа Coder01 Общие вопросы Delphi 10 24.08.2010 19:34
Спецы!! Проверьте прогу почему работает неправильно?? SanSanblch Общие вопросы Delphi 2 05.12.2008 18:17