powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Событие из UserControl
17 сообщений из 17, страница 1 из 1
Событие из UserControl
    #39982642
tatarnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Решил попробовать сделать свой 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
Событие из UserControl
    #39982679
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tatarnikov
Подскажите как передать событие кнопки в MainWindow.

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

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

его проблема в том, что кнопка в UserControl и обработчик события в CodeBehind файле контрола, а он хочет ловить событие в CodeBehind файле самого окна, делать обработчик события кнопки Public или Internal еще больший зашквар, за такое сразу на кол надо сажать
...
Рейтинг: 0 / 0
Событие из UserControl
    #39982818
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>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
Событие из UserControl
    #39982834
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Событие из UserControl
    #39982859
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

лично я UserControl'ом вообще не пользуюсь в 99.9% случаев
...
Рейтинг: 0 / 0
Событие из UserControl
    #39982870
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>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
Событие из UserControl
    #39982904
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
лично я UserControl'ом вообще не пользуюсь в 99.9% случаев

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

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

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

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

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

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


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