Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Событие из UserControl / 17 сообщений из 17, страница 1 из 1
22.07.2020, 12:28
    #39982642
tatarnikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
Всем привет.
Решил попробовать сделать свой UserControl в ListBox накидал пример.
Подскажите как передать событие кнопки в MainWindow.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<UserControl x:Class="ExampleMyUserComtrol.MyUserControl"
             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:local="clr-namespace:ExampleMyUserComtrol"
             mc:Ignorable="d" MinHeight="50" MinWidth="300">
    <Grid>
        <Border Width="Auto" Height="Auto" >
            <Canvas Background="AntiqueWhite" >
                <TextBlock x:Name="tbText"  Text="Здесь какая-то запись" Height="20" Width="200" Background="Snow" HorizontalAlignment="Left" Margin="14,14,0,14"/>
                <Button Content="Button" Canvas.Left="220" Canvas.Top="14" Width="75" Click="myButton_Click"/>
            </Canvas>
        </Border>
    </Grid>
</UserControl>





Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<Window x:Class="ExampleMyUserComtrol.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:ExampleMyUserComtrol"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="500">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="320"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <ListBox Grid.Column="0" HorizontalContentAlignment="Stretch" Background="Lavender">
            <local:MyUserControl />
            <local:MyUserControl />
            <local:MyUserControl />
        </ListBox>
    </Grid>
</Window>





Модератор: Тема перенесена из форума "WinForms, .Net Framework".
...
Рейтинг: 0 / 0
22.07.2020, 13:29
    #39982679
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
tatarnikov
Подскажите как передать событие кнопки в MainWindow.

Никак. Нужно использовать команды, и биндинг к командам вьюмодели.
...
Рейтинг: 0 / 0
22.07.2020, 13:49
    #39982690
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
Сон Веры Павловны
Никак
Ну формально всё-таки можно (чтобы ТСа не ввести в заблуждение). Но не нужно
Сон Веры Павловны
Нужно использовать команды
...
Рейтинг: 0 / 0
22.07.2020, 13:50
    #39982691
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
как вариант:
1) зарегистрируйте своё маршрутизируемую команду или используйте существующую из класса ApplicationCommands (но своё всегда лучше)
2) добавьте в <Window.CommandBindings> параметры биндинга для этой команды и код обработчика событий (2 метода) в Code-Behind файле.

пример делать лень, в гугле найдете все за 5 минут
данный вариант не является "правильным решением", но как временное решение или решение на коленке имеет место быть.
правильно делать так, как вам написали выше.
...
Рейтинг: 0 / 0
22.07.2020, 14:14
    #39982714
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
>tatarnikov, сегодня, 12:28 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327618&msg=22171622][22171622]
>Подскажите как передать событие кнопки в MainWindow.
<
Вызвать соответствующий метод интерфейса, что реализован в MainWindow (понимаю, что для Вас это выглядит дико).
...
Рейтинг: 0 / 0
22.07.2020, 15:48
    #39982776
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
ВМоисеев,

его проблема в том, что кнопка в UserControl и обработчик события в CodeBehind файле контрола, а он хочет ловить событие в CodeBehind файле самого окна, делать обработчик события кнопки Public или Internal еще больший зашквар, за такое сразу на кол надо сажать
...
Рейтинг: 0 / 0
22.07.2020, 19:01
    #39982818
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
>Roman Mejtes, сегодня, 15:48 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327618&msg=22171803][22171803]
>его проблема в том, что кнопка в UserControl и обработчик события в CodeBehind файле контрола…
<
Я живу в несколько другом мире. Здесь кнопка находится в UserControl и здесь же находится и метод обработки события. Что конкретно делает метод обработки вопрос вторичный. В частности он может вызвать метод интерфейса в MainWindow для загрузки другого UserControl. Поэтому я не вставляю UserControl в поле списка. Здесь находится его имя.
...
Рейтинг: 0 / 0
22.07.2020, 20:08
    #39982834
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
...
Рейтинг: 0 / 0
22.07.2020, 21:52
    #39982859
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
ВМоисеев,

лично я UserControl'ом вообще не пользуюсь в 99.9% случаев
...
Рейтинг: 0 / 0
22.07.2020, 22:48
    #39982870
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
>Roman Mejtes, сегодня, 21:52 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327618&msg=22171990][22171990]
>лично я UserControl'ом вообще не пользуюсь в 99.9% случаев
<
С точностью до наоборот - весь интерфейс пользователя (а-ля SPA) попытался построить на базе UserControl-ов.
...
Рейтинг: 0 / 0
23.07.2020, 03:02
    #39982904
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
Roman Mejtes
лично я UserControl'ом вообще не пользуюсь в 99.9% случаев

Такая же фигня. И в 99,9% не использую EventHandler'ы.
...
Рейтинг: 0 / 0
23.07.2020, 10:23
    #39982956
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
>Сон Веры Павловны, сегодня, 03:02 [22172068]
>Такая же фигня. И в 99,9% не использую EventHandler'ы.
<
Если возможно, приведите пример структуры приложения (решения) для работы с некоторым количеством сущностей, что хранятся в базе данных.
Пример на слайде.
uc… - userControl.
...
Рейтинг: 0 / 0
23.07.2020, 10:58
    #39982972
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
ВМоисеев
uc… - userControl

И как же я его могу привести, если, как я выше писал, я не работаю с UserControl?
Если же интересует, как я работаю с событиями - то см. выше, ICommand+биндинг к командам вьюмодели. На эту тему написаны тысячи всяческих гайдов, и это весьма тривиальная вещь, в этом нет ничего особенного.
...
Рейтинг: 0 / 0
23.07.2020, 11:43
    #39982991
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
>Сон Веры Павловны, сегодня, 10:58 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327618&msg=22172168][22172168]
>И как же я его могу привести, если, как я выше писал, я не работаю с UserControl?
<
< UserControl - это мой вариант решения.
< Как выглядит Ваш, без UC?
...
Рейтинг: 0 / 0
23.07.2020, 11:46
    #39982993
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
tatarnikov , дополню ответ.

UserControl используется (обычно) для задания Представлений насыщенных элементами и имеющими внутреннюю логику.
Наиболее типичное использование - Представление ViewModel.

В вашей же задаче вы его используете для представления элемента коллекции.
Для этого случая гораздо лучше подходит шаблон данных для элемента ItemsControl (ListBox).

Пример реализации.

Вспомогательный тип для задания коллекции в XAML:
Код: c#
1.
    public class StringCollectionINCC : ObservableCollection<string> { }



XAML Окна:
Код: 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.
    <Window.Resources>
        <DataTemplate x:Key="String.ItemTemplate" DataType="{x:Type sys:String}">
            <Border Background="AntiqueWhite">
                <Grid Margin="14">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding}"
                               Height="20" Width="200"
                               Background="Snow" Margin="0,0,14,0"/>
                    <Button Content="Remove" Grid.Column="1" Width="75"
                        Command="Delete"
                        CommandParameter="{Binding}"/>
                </Grid>
            </Border>
        </DataTemplate>
        <local:StringCollectionINCC x:Key="Names">
            <sys:String>Первый</sys:String>
            <sys:String>Второй</sys:String>
            <sys:String>Третий</sys:String>
        </local:StringCollectionINCC>
    </Window.Resources>
    <Grid>
        <Grid.CommandBindings>
            <CommandBinding Command="Delete" Executed="CommandBinding_Executed"/>
        </Grid.CommandBindings>
        <ListBox Background="Lavender"
                 ItemsSource="{Binding Mode=OneWay, Source={StaticResource Names}}"
                 ItemTemplate="{Binding Mode=OneWay, Source={StaticResource String.ItemTemplate}}">
        </ListBox>
    </Grid>
</Window>



Code Behind Окна:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Collection<string> names = (Collection<string>)Resources["Names"];
            if (e.Parameter is String name && names.Contains(name))
                names.Remove(name);

            e.Handled = true;
        }
    }




Если делать реализацию в MVVM (что ОЧЕНЬ желательно), то коллекцию элементов и команду надо Привязывать к свойствам ViewModel.
...
Рейтинг: 0 / 0
23.07.2020, 12:00
    #39982999
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
ВМоисеев
Как выглядит Ваш, без UC?

Выглядит как прямое наследование от Control (либо нужного наследника Control - напр, ContentControl). Никакого code behind, класс отдельно, шаблон по умолчанию - отдельно, взаимодействие между составными частями - посредством template parts, определяемых в OnApplyTemplate.
Eld Hasp
UserControl используется (обычно) для задания Представлений насыщенных элементами и имеющими внутреннюю логику.

Стандартный DataGrid (например) более чем насыщен элементами и внутренней логикой. Однако он не является UserControl. Более того, я вообще не припомню ни одного класса из стандартных сборок, которые были бы унаследованы от UserControl.
...
Рейтинг: 0 / 0
23.07.2020, 12:07
    #39983006
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из UserControl
Сон Веры Павловны
Eld Hasp
UserControl используется (обычно) для задания Представлений насыщенных элементами и имеющими внутреннюю логику.

Стандартный DataGrid (например) более чем насыщен элементами и внутренней логикой. Однако он не является UserControl. Более того, я вообще не припомню ни одного класса из стандартных сборок, которые были бы унаследованы от UserControl.

Возможно я неверно выразился.
Я воспринимаю (и использую) UserControl как аналог Page.
Допустим, для создания однооконного приложения с навигацией.
Или для Представления разных регионов в одном окне: для каждого региона свой тип с данными (вложенная или дочерняя VM) и для этого типа свой UserControl с нужным Представлением.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Событие из UserControl / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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