Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 2 таблицы раскраска строк  [new]
pooleet
Member

Откуда:
Сообщений: 45
Здравствуйте!
Есть 2 таблицы.
1 таблица с трока с идентификатором.
2-я содержит идентификаторы из 1 таблицы.

Задача при нажатии на строку 2-ой таблицы выделать строки в 1-ой таблице содержащие идентификаторы из столбцов 2-ой.

К сообщению приложен файл. Размер - 23Kb
14 мар 19, 07:53    [21832011]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
pooleet
Member

Откуда:
Сообщений: 45
pooleet,

К сообщению приложен файл (2table.7z - 20Kb) cкачать
14 мар 19, 07:54    [21832012]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
vb_sub
Member

Откуда:
Сообщений: 569
Это что лабораторная работа?
14 мар 19, 09:44    [21832071]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
pooleet
Member

Откуда:
Сообщений: 45
vb_sub,

Это мое 1-е приложение на wpf и это только тот кусок который вызвал у меня вопросы.
Не вижу смысла перегружать вопрос кодом не относящимся к вопросу. Не совсем понимаю привязку между элементами. Хочу на простом примере разобраться.
14 мар 19, 13:32    [21832468]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20659
pooleet
тот кусок который вызвал у меня вопросы.
я лично не нашел ни одного вопроса в вашем сообщении
14 мар 19, 13:40    [21832492]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
vb_sub
Member

Откуда:
Сообщений: 569
Пример для выделения 1-го элемента в 1-й таблице
<Window x:Class="wpf2Table.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:wpf2Table"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <DataGrid Grid.Row="0" ItemsSource="{Binding ItemList}"  SelectedItem="{Binding SelectedItem}"/>

        <DataGrid Grid.Row="1" ItemsSource="{Binding ItemList2}" SelectedItem="{Binding SelectedItem2}"/>

    </Grid> 
    
</Window>


  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new MainViewModel();
        }
    }


Модели
 public class Item
    {
        public int id { get; set; }
        public string Name { get; set; }
    }

   public class Item2
    {

        public int ID { get; set; }

        public int ID2 { get; set; }

        public int ID3 { get; set; }

    }


ViewModel
 public class MainViewModel:BaseModel
    {
        public List<Item> ItemList { get; set; }

        public List<Item2> ItemList2 { get; set; }


        /// <summary>
        /// Выбранные элементы в 1-й таблице
        /// </summary>
        private Item _SelectedItem;

        public Item SelectedItem
        {
            get { return _SelectedItem; }
            set { _SelectedItem = value; OnPropertyChanged(); }
        }


        /// <summary>
        /// Выбранный элемент во 2-й таблице
        /// </summary>
        private Item2 _SelectedItem2;

        public Item2 SelectedItem2
        {
            get { return _SelectedItem2; }
            set {
                _SelectedItem2 = value;
                var Finded = ItemList.Where(f=>f.id==value.ID2 || f.id == value.ID3);

                if (Finded.Any())
                {
                    SelectedItem = Finded.FirstOrDefault();
                }

            }
        }



        public MainViewModel()
        {
            ItemList = new List<Item>()
            {
               new Item { id=1, Name="Apple1"},
               new Item { id=2, Name="Apple2"},
               new Item { id=3, Name="Apple3"},
            };


            ItemList2 = new List<Item2>
         {
            new Item2 { ID=1, ID2=2},
            new Item2 { ID=2, ID2=2, ID3=3},
            new Item2 { ID=3, ID3=1},
        };

        }
    }


Базовая ViewModel
   /// <summary>
    /// OnPropertyChanged для моделей
    /// </summary>

    public abstract class BaseModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public BaseModel()
        {

        }
    }
14 мар 19, 13:42    [21832500]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
pooleet
Member

Откуда:
Сообщений: 45
vb_sub,

если легче по недоделанному проекту, то это действие нужно сделать с таблицами провод (1) и катушка (2). данные из текстового файла (открыть проект)

К сообщению приложен файл (Wires.7z - 42Kb) cкачать
14 мар 19, 13:42    [21832502]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
vb_sub
Member

Откуда:
Сообщений: 569
pooleet,
у тебя неверная постановка задачи- такой функционал, который ты хочешь имеет 0% полезности.
Если ты хочешь выделять цветом строки в 1-м DataGrid по условию выделения во 2-м, то для этого не нужно делать Selected, нужно использовать DataTrigger для строки. Тем более если у тебя в первом DataGrid будет много строк, то ты не увидишь выделенные строки.
14 мар 19, 13:50    [21832518]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
pooleet
Member

Откуда:
Сообщений: 45
vb_sub,
Спасибо за пример, попробую тогда через триггеры сделать
15 мар 19, 08:50    [21833272]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
pooleet
Member

Откуда:
Сообщений: 45
делаю так. пока хочу все строки красным закрасить без условия, ничего не происходит.
Если не сложно покажите пример правильной привязки

            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ColorRoww}" Value="false">
                            <Setter Property="Background" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>


 private bool _ColorRoww = false;
        public bool ColorRoww
        {

            get { return _ColorRoww; }
            set
            {
                _ColorRoww = value;
                OnPropertyChanged();
            }
        }
19 мар 19, 11:05    [21837000]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
vb_sub
Member

Откуда:
Сообщений: 569
pooleet,

<Window x:Class="wpf2Table.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:wpf2Table"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Triggered}" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                    
                    <DataTrigger Binding="{Binding Triggered}" Value="False">
                        <Setter Property="Background" Value="Green" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>
        
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <DataGrid Grid.Row="0" ItemsSource="{Binding ItemList}"  SelectedItem="{Binding SelectedItem}"/>

        <DataGrid Grid.Row="1" ItemsSource="{Binding ItemList2}" SelectedItem="{Binding SelectedItem2}"/>

        <Button Width="80" Height="30" HorizontalAlignment="Right"  Command="{Binding TriggerCommand}"  Margin="5" VerticalAlignment="Bottom"/>

    </Grid>
      



    public class MainViewModel:BaseModel
    {
        public List<Item> ItemList { get; set; }

        public List<Item2> ItemList2 { get; set; }


        /// <summary>
        /// Вызвать изменение свойства, которое слушает DataTrigger
        /// </summary>
        public ICommand TriggerCommand { get; set; }

        /// <summary>
        /// Выбранные элементы в 1-й таблице
        /// </summary>
        private Item _SelectedItem;

        public Item SelectedItem
        {
            get { return _SelectedItem; }
            set { _SelectedItem = value; OnPropertyChanged(); }
        }


        /// <summary>
        /// Выбранный элемент во 2-й таблице
        /// </summary>
        private Item2 _SelectedItem2;

        public Item2 SelectedItem2
        {
            get { return _SelectedItem2; }
            set {
                _SelectedItem2 = value;
                var Finded = ItemList.Where(f=>f.id==value.ID2 || f.id == value.ID3);

                if (Finded.Any())
                {
                    SelectedItem = Finded.FirstOrDefault();
                }

            }
        }



        public MainViewModel()
        {
            ItemList = new List<Item>()
            {
               new Item { id=1, Name="Apple1"},
               new Item { id=2, Name="Apple2"},
               new Item { id=3, Name="Apple3"},
            };


            ItemList2 = new List<Item2>
         {
            new Item2 { ID=1, ID2=2},
            new Item2 { ID=2, ID2=2, ID3=3},
            new Item2 { ID=3, ID3=1},
        };

            TriggerCommand = new RelayCommand(()=>MakeTrigger());


        }

        private void MakeTrigger()
        {
            ItemList.First().Triggered = !ItemList.First().Triggered;
        }
    }


    public class Item:BaseModel
    {
        public int id { get; set; }
        public string Name { get; set; }

        /// <summary>
        /// Вызов DataTrigger
        /// </summary>

        private bool _Triggered;
        public bool Triggered
        {
            get { return _Triggered; }
            set { _Triggered = value;OnPropertyChanged(); }
        }

    }
19 мар 19, 13:58    [21837323]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
pooleet
Member

Откуда:
Сообщений: 45
vb_sub, Спасибо )))))

у меня получилось так
private Item2 _SelectedItem2;

        public Item2 SelectedItem2
        {
           
            get { return _SelectedItem2; }
            set
            {
                 ItemList.ForEach(x => x.Triggered = false);
                _SelectedItem2 = value;
                ItemList.FindAll(s => s.id== _SelectedItem2.ID2).ForEach(x => x.Triggered = true );
                ItemList.FindAll(s => s.id == _SelectedItem2.ID3).ForEach(x => x.Triggered = true);

  
            }
        }
21 мар 19, 07:48    [21839092]     Ответить | Цитировать Сообщить модератору
 Re: 2 таблицы раскраска строк  [new]
vb_sub
Member

Откуда:
Сообщений: 569
    ItemList.FindAll(s => s.id== _SelectedItem2.ID2 || s.id== _SelectedItem2.ID3).ForEach(x => x.Triggered = true );
21 мар 19, 12:00    [21839389]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить