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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2015, 10:56   #1
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию WPF UnifromGrid

Добрый день, хочу сделать такое приложение.
Подразумевается что каждая "PanelN" будем иметь функциональность Element. Как лучше это организовать в WPF? Что лучше использовать code behind или Xaml.
Изображения
Тип файла: png 4.PNG (16.4 Кб, 93 просмотров)
Тип файла: png 8.PNG (22.2 Кб, 66 просмотров)
Тип файла: png Element.PNG (7.8 Кб, 84 просмотров)
CWD вне форума Ответить с цитированием
Старый 29.03.2015, 11:03   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что такое "функциональность Element"?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2015, 11:09   #3
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

Это маленькая панелька у которой есть Label, две кнопки checkbox и combobox. Нижняя картинка.
CWD вне форума Ответить с цитированием
Старый 29.03.2015, 12:07   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А чего эти кнопки, чекбокс и комбокс делают-то?

Это по разному реализовывать можно. Можно например UserControl создать и 8 раз положить в грид (не обязательно Uniform, у вас ж и так размер одинаковый). Или в ItemsControl (с WrapPanel в ItemsPanelTemplate) использовать ItemTemplate.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2015, 12:15   #5
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А чего эти кнопки, чекбокс и комбокс делают-то?
Оно отвечает например за покупку разного товара. Если пойти по пути ItemTemplate, как потом "отлавливать" именно клик на определенную кнопку?
CWD вне форума Ответить с цитированием
Старый 29.03.2015, 12:28   #6
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

mvvm учите коли за WPF взялись
lomastr_ вне форума Ответить с цитированием
Старый 29.03.2015, 12:37   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Биндинг примерно типа такого:

Код:
<Button Command="{Binding DataContext.DoSmthCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding .}">
В данном примере DoSmthCommand находится в ViewModel основного окна (ну или другого контейнера, в котором это все лежит) и команде в параметр передаются данные этого элемента, ну то есть к ItemsSource у ItemsControl прибиндено что-то:
Код:
ItemsSource="{Binding SomeItems}"
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2015, 21:25   #8
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Биндинг примерно типа такого:

Код:
<Button Command="{Binding DataContext.DoSmthCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding .}">
В данном примере DoSmthCommand находится в ViewModel основного окна (ну или другого контейнера, в котором это все лежит) и команде в параметр передаются данные этого элемента, ну то есть к ItemsSource у ItemsControl прибиндено что-то:
Код:
ItemsSource="{Binding SomeItems}"
Воспользовался вашим советом и сделал примерно следующее.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using GalaSoft.MvvmLight.Command;

namespace WpfApplication13
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    /// 
    public class DataStruct
    {
        public int number;
        public string name;
    }
    public class Test
    {
        public RelayCommand<object> TestCommand { get; set; }
        public ObservableCollection<DataStruct> TestCollection { get; set; }
        public Test()
        {
            TestCommand = new RelayCommand<object>((e) => GetClick(e));
            TestCollection = new ObservableCollection<DataStruct>();
            TestCollection.Add(new DataStruct {name="First",number=1 });
            TestCollection.Add(new DataStruct { name = "Second", number = 2 });
        }
        public void GetClick(object param)
        {
            System.Windows.MessageBox.Show(param.ToString());
        }
    }
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.DataContext = new Test();
            InitializeComponent();
        }
    }
}
Код:
<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication13"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:Test x:Key="TestError"></local:Test>
    </Window.Resources>
    <Grid>
        <ItemsControl ItemsSource="{Binding TestCollection}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="2" Rows="2">
                    </UniformGrid>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Button Content="OK" Grid.Column="0" Grid.Row="0" DataContext="{StaticResource TestError}" Command="{Binding TestCommand}" CommandParameter="{Binding .}"/>
                        <Button Content="Test" Grid.Column="0" Grid.Row="1"/>
                    </Grid>

                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>
Но как теперь узнать на какую именно кнопку кликнул пользователь и какому объекту она принадлежала? First или Second?
CWD вне форума Ответить с цитированием
Старый 29.03.2015, 21:53   #9
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

все есть в контексте биндинга
lomastr_ вне форума Ответить с цитированием
Старый 29.03.2015, 22:08   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык вы параметр для чего передаете команде? Вот оттуда и узнать.

Только у вас из-за биндинга к DataContext в кнопке вы параметром передаете весь этот DataContext.

Я ж не зря написал ту кучу букв про RelativeSource. (не уверен, что это лучшее решение, давно не писал на WPF, просто скопипастил из древнего проекта)

Код:
        <ItemsControl ItemsSource="{Binding TestCollection}">
...
                        <Button Content="{Binding Name}" Grid.Column="0" Grid.Row="0"
                                Command="{Binding DataContext.TestCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding .}"/>
Код:
using System.Windows;
using System.Collections.ObjectModel;
using GalaSoft.MvvmLight.Command;

namespace WpfApplication13
{
    public class DataStruct
    {
        public int Number { get; set; }
        public string Name { get; set; }
    }

    public class TestViewModel
    {
        public TestViewModel()
        {
            TestCommand = new RelayCommand<DataStruct>((e) => GetClick(e));

            TestCollection = new ObservableCollection<DataStruct>
            {
                new DataStruct {Name = "First", Number = 1},
                new DataStruct {Name = "Second", Number = 2}
            };
        }

        public ObservableCollection<DataStruct> TestCollection { get; set; }

        public RelayCommand<DataStruct> TestCommand { get; set; }

        public void GetClick(DataStruct param)
        {
            MessageBox.Show(param.Name);
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            DataContext = new TestViewModel();
            InitializeComponent();
        }
    }
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 15:00
WPF на XP Strangers C# (си шарп) 5 04.06.2013 08:31
WPF и С# Митовей C# (си шарп) 1 12.11.2012 18:06
C# WPF Kukurudza C# (си шарп) 1 12.09.2012 18:14
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10