powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Можно ли в шаблон отправить данные?
8 сообщений из 8, страница 1 из 1
Можно ли в шаблон отправить данные?
    #39518240
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть десятки столбцов, шаблон которых один и тот же:
Код: xml
1.
2.
<GridViewColumn Header="Параметр dx1"
                CellTemplate="{DynamicResource EditableTextBox}" />


Вот сам шаблон (для простоты всё лишнее выкинул, огромную кучу форматирования)
Код: xml
1.
2.
3.
<DataTemplate x:Key="EditableTextBox">
    <TextBox Text="{Binding Mode=OneWay, Path=param_dx1}"/>
</DataTemplate>


Есть возможность путь указать где-то в GridViewColumn, а не в шаблоне? А то получается, что мне для нескольких десятков столбцов приходится делать несколько десятков одинаковых(!!) шаблонов, отличающихся только значением Path=...

Если я в первый кусок кода добавлю одну строку:
Код: xml
1.
2.
3.
<GridViewColumn Header="Параметр dx1"
                DisplayMemberBinding="{Binding Mode=TwoWay, Path=param_dx1}" />
                CellTemplate="{DynamicResource EditableTextBox}" />


то, соответственно, CellTemplate игнорируется.
Как бы мне вот этот вот Path указать прямо в параметре CellTemplate?
...
Рейтинг: 0 / 0
Можно ли в шаблон отправить данные?
    #39518244
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опечатался, там "/>" лишнее.
...
Рейтинг: 0 / 0
Можно ли в шаблон отправить данные?
    #39518338
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дерьмовенький, но рабочий вариант, думаю, его можно значительно улучшить или выбрать другой вариант.
Например DataTemplateSelector и автогенерацию шаблона

Код: 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.
<Window x:Class="ListViewItem.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:ListViewItem"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{StaticResource {x:Type local:MainModel}}">
    <Window.Resources>
        <DataTemplate x:Key="MyCellTemplate">
            <TextBlock Text="{local:ListViewDisplayMemberResolver}"/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListView ItemsSource="{Binding Persones}" >
            <ListView.View>
                <GridView>
                    <GridViewColumn local:ListViewEx.DisplayMember="Name" CellTemplate="{StaticResource MyCellTemplate}" Header="Name" />
                    <GridViewColumn local:ListViewEx.DisplayMember="Age" CellTemplate="{StaticResource MyCellTemplate}" Header="Age" />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<Application x:Class="ListViewItem.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:ListViewItem"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <local:MainModel x:Key="{x:Type local:MainModel}"/>
    </Application.Resources>
</Application>


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
using System.Collections.Generic;

namespace ListViewItem
{
    public class Person
    {
        public string Name { set; get; }
        public int Age { set; get; }
    }

    public class MainModel
    {
        public IEnumerable<Person> Persones { get; } = new List<Person>
        {
            new Person { Name = "Roman", Age = 15 },
            new Person { Name = "Ivan", Age = 16 },
            new Person { Name = "Peter", Age = 17 },
            new Person { Name = "Valera", Age = 18 },
            new Person { Name = "Nikolay", Age = 19 }
        };
    }
}


Код: c#
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Markup;
using System.Windows.Media;

namespace ListViewItem
{
    [MarkupExtensionReturnType(typeof(Binding))]
    public class ListViewDisplayMemberResolver : MarkupExtension
    {
        /// <summary>Ищет Visual объект findChild в заданном parent, если объект найден, возвращает True</summary>
        /// <param name="parent">Объект родитель в котором осуществляется поиск</param>
        /// <param name="findChild">Искомый объект</param>
        /// <returns>Результат поиска</returns>
        private static bool ExistChild(DependencyObject parent, Visual findChild)
        {
            if (parent == null) throw new ArgumentException(nameof(parent));
            if (findChild == null) throw new ArgumentException(nameof(findChild));

            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                if (Equals(child, findChild)) return true;
                var childrensExist = ExistChild(child, findChild);
                if (childrensExist) return true;
            }

            return false;
        }

        /// <summary>
        /// Находит родительский объект заданного типа, аналогично FindAncestor, AncestorType=<typeparamref name="T"/>
        /// </summary>
        /// <typeparam name="T">Тип искомого элемента</typeparam>
        /// <param name="element">Исходный объект</param>
        /// <returns>Найденный элемент, если не найден, возвращает null</returns>
        private static T FindVisualParent<T>(Visual element) where T : UIElement
        {
            var parent = element;
            while (parent != null)
            {
                if (parent is T correctlyTyped)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as Visual;
            }

            return null;
        }

        /// <summary> Возвращает индекс колонки на основе поиска </summary>
        /// <param name="parent">Предок</param>
        /// <param name="findElement">Потомок</param>
        /// <returns>Индекс элемента</returns>
        private int GetIndexColumn(Visual parent, Visual findElement)
        {
            var childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (var i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i) as Visual;
                if (ExistChild(child, findElement))
                    return i;
            }
            return -1;
        }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var valueProvider = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
            if (valueProvider.TargetObject.GetType().FullName == "System.Windows.SharedDp") return this;
            var target = valueProvider.TargetObject as Visual;
            //Находим GridViewRowPresenter
            var rowPresenter = FindVisualParent<GridViewRowPresenter>(target);
            var columns = rowPresenter.Columns;
            var index = GetIndexColumn(rowPresenter, target);
            var column = columns[index];
            var bindingMember = (string)column.GetValue(ListViewEx.DisplayMemberProperty);
            BindingOperations.SetBinding(target, (DependencyProperty)valueProvider.TargetProperty, new Binding(bindingMember));
            return null;
        }
    }
    public static class ListViewEx
    {
        public static string GetDisplayMember(DependencyObject obj) { return (string)obj.GetValue(DisplayMemberProperty); }
        public static void SetDisplayMember(DependencyObject obj, string value) { obj.SetValue(DisplayMemberProperty, value); }
        public static readonly DependencyProperty DisplayMemberProperty =
            DependencyProperty.RegisterAttached("DisplayMember", typeof(string), typeof(ListViewEx), new PropertyMetadata(null));
    }


}
...
Рейтинг: 0 / 0
Можно ли в шаблон отправить данные?
    #39518683
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибище!! за этот "дерьмовенький" пример. Он очень полезен!)))
...
Рейтинг: 0 / 0
Можно ли в шаблон отправить данные?
    #39518685
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не очень понимаю, что за переменная correctlyTyped.
И странная запись
Код: c#
1.
if (parent is T correctlyTyped)


я раньше такую не встречал. Студия, соответственно, ругается на то, что вместо correctlyTyped должна быть закрывающая скобка.
...
Рейтинг: 0 / 0
Можно ли в шаблон отправить данные?
    #39518686
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал иначе (мало ли, кому другому понадобится)
Код: c#
1.
2.
3.
4.
5.
T correctlyTyped = parent as T;
if (correctlyTyped != null)
{
    return correctlyTyped;
}
...
Рейтинг: 0 / 0
Можно ли в шаблон отправить данные?
    #39518688
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласенне очень понимаю, что за переменная correctlyTyped.
И странная запись
Код: c#
1.
if (parent is T correctlyTyped)



я раньше такую не встречал. Студия, соответственно, ругается на то, что вместо correctlyTyped должна быть закрывающая скобка.
это в новой версии C# появилось, с 7 версии кажется (VS2017)
можно объявить переменную непосредственно в условии, удобно, понятно.
...
Рейтинг: 0 / 0
Можно ли в шаблон отправить данные?
    #39518711
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласенне очень понимаю, что за переменная correctlyTyped.
И странная запись
Код: c#
1.
if (parent is T correctlyTyped)


я раньше такую не встречал. Студия, соответственно, ругается на то, что вместо correctlyTyped должна быть закрывающая скобка.
Это называется pattern matching, да, появилось в C#7: https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching - см. раздел "The is type pattern expression".
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Можно ли в шаблон отправить данные?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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