powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataTemplate ICommand
30 сообщений из 30, показаны все 2 страниц
DataTemplate ICommand
    #37876660
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че-то пока не получилось найти оперативно решение - буду продолжать искать. Но возможно кто-то уже сталкивался с этим и поможет быстрее решить проблему.

Есть что-то вроде этого

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="2">
                        <!--Layer visibility checkbox-->
                        <TextBlock Text="{Binding VisibleId, Mode=OneWay}" Margin="5,0,2,0"/>
                        <CheckBox IsChecked="{Binding Visible, Mode=TwoWay}" x:Name="x_ComboBox" >
                            <i:EventTrigger EventName=".Checked">
                                <i:InvokeCommandAction Command="{Binding VisibleLayerDynamicCommand}">
                                    <i:InvokeCommandAction.CommandParameter>
                                        <MultiBinding Converter="{StaticResource r_UserControlConverter}">
                                            <Binding ElementName="x_LayersUC"/>
                                        </MultiBinding>
                                    </i:InvokeCommandAction.CommandParameter>
                                </i:InvokeCommandAction>
                            </i:EventTrigger>
                        </CheckBox>



Но у меня команда не срабатывает. Если я прицеплю команду к самому листбоксу (соответсвенно команда для листбокска - типа mouseneter) то команда срабатывает. Но мне то нужно обработать команду чекбокса.
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37876672
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

output window что показывает?
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37876691
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Вот что показывает

Код: c#
1.
System.Windows.Data Error: 40 : BindingExpression path error: 'VisibleLayerDynamicCommand' property not found on 'object' ''LayerDynamicItem' (HashCode=57903701)'. BindingExpression:Path=VisibleLayerDynamicCommand; DataItem='LayerDynamicItem' (HashCode=57903701); target element is 'InvokeCommandAction' (HashCode=46874050); target property is 'Command' (type 'ICommand')
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37876693
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

вот видишь :) теперь и сам исправишь :)
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37876713
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Я пока никак не могу сообразить что не так))
Если я выношу все за DataTemplate - то работает для тех контролов, которые находятся во ВНЕ.
Но все, что сидит в DataTemplate не прокатывает
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37877189
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

В общем вопрос решил.
Но все-таки зря ты так к нему легко отнесся.
Пока рылся в инете понял, что это популярная проблема))

Смысл проблемы в том, что контрол, встроенный в DataTemplate не виден базовому контролу (User или Window).
Поэтому есть два решения проблемы:

1. Самый простой - указываем статик ресурс непосредственно на класс команд - это решение в лоб, и тем, кто придерживается паттерна MVVM оно может не понравиться))

2. Не буду расписывать что и почему - вот ссылка, думаю кто захочет - разберется
http://stackoverflow.com/questions/5576487/eventtrigger-not-working-inside-itemscontrol-in-mvvm
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37877397
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не проблема. Связывание нужно задавать через RelativeSource
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37877455
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

В том -то дело что не прокатывает.
Вот скажи мне разницу между двумя этими кодами с точки зрения исполнения:

<TextBox Text="10" x:Name="name_text" FontSize={Binding ElementName=name_text, Path=Text}/>
и
<TextBox Text="10" x:Name="name_text" FontSize={Binding RelativeSource={RelativeSource self}, Path=Text}/>

С точки зрения выполнения кода никакой разница - стиль написания разный.
Так вот - попробуй сам у себя к UserControl прицепи через DataContext ViewModel, в которой у тебя будут команды (н наверо еще что-то будет).
Далее в UserControl у тебя будет ListBox, который будет определять DataTemplate, в котором будет, например CheckBox/
А вот теперь попробуй через RelativeSource подцепить команду от UserControl к CheckBox, а потос через ICommand обработай ее (если подцепиш конечно).

Я тебе даже больше скажу - если ты через команду во вне передашь свой юзер контрол и посомтришь что в нем сидит - то ты никаких CheckBox не увидишь.
Чтобы добраться до CheckBox который сидит в DateTamplate - то надо другой способ вытаскивания эелементов испльзовать, а не стандартный FindName.
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37877488
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, проблема известная. Причина в том, что элементы DataTemplate не являются частью logical tree основного контекста. У меня эта проблема как-то раз всплыла при привязке ICommand к пунктам контекстного меню, которое было частью DataTemplate - выкрутился примерно так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<DataTemplate x:Key="SomeTemplate">
  <ContentControl Content="{Binding Editor}"
      Tag="{Binding ElementName=SomeWindow, Path=DataContext}">
    <ContentControl.ContextMenu>
      <ContextMenu>
        <MenuItem Header="Refresh"
            Command="{Binding Parent.PlacementTarget.Tag.SelectedItem.RefreshCommand, 
            RelativeSource={RelativeSource Self}}"
            CommandParameter="{Binding}"
            >
....


Если не изменяет память, помогло вот это обсуждение: http://stackoverflow.com/questions/9994241/mvvm-binding-command-to-contextmenu-item
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37877610
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал и не раз. тынц
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37877671
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

Не понимаю, почему у тебя идет,а у меня - нет.
Может быть дашь примерчик небольшой?
Ту ссылку - которую т ыдал - она не прокатывает - только что попробовал.
Вот такой код:

Код: 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.
<UserControl x:Class="ClientGIS_FSK.View.LayersUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:converters="clr-namespace:ClientGIS_FSK.Converters"
             x:Name="x_LayersUC" Opacity="0.7">
    <UserControl.Resources>
        <converters:UserControlConverterWithParams x:Key="r_UserControlConverterWithParams"/>
    </UserControl.Resources>
    <ScrollViewer Height="280">
        <ListBox x:Name="x_LayersListBox" >            
            <ListBox.ItemTemplate>
                <DataTemplate>                    
                    <StackPanel Orientation="Horizontal" Margin="2">
                        <!--Layer visibility checkbox-->
                        <TextBlock Text="{Binding VisibleId, Mode=OneWay}" Margin="5,0,2,0"/>
                        <CheckBox IsChecked="{Binding Visible, Mode=TwoWay}" x:Name="x_CheckBox" Tag="{Binding VisibleId, Mode=OneWay}">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Checked">
                                    <i:InvokeCommandAction Command="{Binding Path=VisibleLayerDynamicCommand}">
                                        <i:InvokeCommandAction.CommandParameter>
                                            <MultiBinding Converter="{StaticResource r_UserControlConverterWithParams}">
                                                <Binding ElementName="x_LayersUC"/>
                                                <Binding ElementName="x_CheckBox" Path="Tag"/>
                                            </MultiBinding>
                                        </i:InvokeCommandAction.CommandParameter>
                                    </i:InvokeCommandAction>
                                </i:EventTrigger>
                                <i:EventTrigger EventName="Unchecked">
                                    <i:InvokeCommandAction Command="{Binding Path=HideLayerDynamicCommand}">
                                        <i:InvokeCommandAction.CommandParameter>
                                            <MultiBinding Converter="{StaticResource r_UserControlConverterWithParams}">
                                                <Binding ElementName="x_LayersUC"/>
                                                <Binding ElementName="x_CheckBox" Path="Tag"/>
                                            </MultiBinding>
                                        </i:InvokeCommandAction.CommandParameter>
                                    </i:InvokeCommandAction>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </CheckBox>                        
                        <TextBlock Text="{Binding Name, Mode=OneWay}" Margin="5,0,2,0"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </ScrollViewer>
</UserControl>



SeVa, добавь к CheckBox RelativeSource так, чтобы команда через ICommand, которая определена в другом файле и подключается к UserControl через DataContext:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public partial class LayersUserControl : UserControl
    {
        private Command.Commands m_Commands;

        public LayersUserControl()
        {
            InitializeComponent();

            m_Commands = new Command.Commands();
            this.DataContext = m_Commands;
        }
   }



Если заработает - я тебе поапладирую двумя руками))
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878400
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

Код: xml
1.
<MultiBinding Converter="{Binding Source={StaticResource r_UserControlConverterWithParams}}">


?
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878424
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так же не ясно куда относится это
Код: xml
1.
<i:InvokeCommandAction Command="{Binding Path=VisibleLayerDynamicCommand}">



в общем правило работы с DataTemplate таково:
чтобы пробить Binding на все что лежит вне блока DataTemplate нужно использовать StaticResource
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878619
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКав общем правило работы с DataTemplate таково:
чтобы пробить Binding на все что лежит вне блока DataTemplate нужно использовать StaticResource
Не обязательно - см. выше мой кусок кода.
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878800
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКа,

Так я об этом и писал выше.
StaticResource - ты напрямую ссылаешься на класс команд. У меня сейчас именно так реализовано.
Но это нарушает паттерн MVVM, так как команды я должно коннектить кидать во ViewModel, а DataContext UserControl цеплять к этой ViewModel. Соответсвенно нельзя испльзовать вариант StaticResource to Command

Я об этом уже выше писал.

Seva же говрит, что он как-то смог подцепить команду к контролу (мой пример) и при этом все цепляется к DataContext UserControl
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878802
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКатак же не ясно куда относится это
Код: xml
1.
<i:InvokeCommandAction Command="{Binding Path=VisibleLayerDynamicCommand}">



в общем правило работы с DataTemplate таково:
чтобы пробить Binding на все что лежит вне блока DataTemplate нужно использовать StaticResource

Почему же это неясно?

Очень даже ясно.
MyUSerControl.DataContext = MyViewModel;

При этом во ViewModel сидит мой класс команд.
Поэтому очень даже все ясно с этим.
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878867
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через StaticResource - можно, но некошерно

<Button Command="{Binding RelativeSource={RelativeSource AncestorType=MyControl}, Path=DataContext.MyCommand}" />
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878873
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37878998
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrusПочему же это неясно?

Очень даже ясно.
MyUSerControl.DataContext = MyViewModel;

При этом во ViewModel сидит мой класс команд.
Поэтому очень даже все ясно с этим.
по феншую ViewModel не должна объявляться во View (в коде).

я лично объявлял статический ресурс и все везде работало как мне хотелось.
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879031
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКа,

Не совсем с тобой согласен.
ViewModel ничего не дожен знать о View.
В этом правило есть смысл - так как я всегда могу подцепить другую View-ху
Поэтому я не зря отписал про MVVM и о том, почему я не стал использовать StaticResource прямо в лоб файла команд.

В общем есть два решения, которые я уже описывал.:

1. Кладем на правила MVVM и испльзуем StaticResource
2. Идем по ссылке - котору я давал в начале темы и делаем так как там описано (то же самое предлагается в ссылке, которую дал УткА
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879051
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

давайте крякать до конца :)

что мешает объявить ViewModel в статических ресурсах Xaml файла?
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879055
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКа,

Ладно, дальше тема ушла в не то направление)))
Главное - чот если кто столкнется с подобным - сможет съэкономить время - заглянув на эту ветку))
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879070
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

ну вот, говоришь человеку: "съешь этих сладких булочек"
а он: "я буду есть грязную вонючую собаку"
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879076
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКа,

Да нет, как раз я использую StaticResource.
Я просто обсуждал с тобой дальше - потому что применение StaticResource в моем случае нарушает концепцию паттерна MVVM
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879078
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

А по поводу грязная булочка и т.п.
Тоже с тобой не соглашусь.

В идеале - не очень хорошо, когда у тебя эелементы цепляются к ресурсам таким образом и т.п.
DataContext не просто так придумывали.
И не зря при правильном написании приложения WPF MVVM к DataContxt корневого элемента целпяют ViewModel и в нее сажают бизнес логику - в том числе и команды.

Ведь представь, ты решил сделать изменения.
Ведь как легко их делать и оперативно, когда у тебя эелемень цепляется к DataContext корневого эелемента, и когда на нем не висит куча разных Resource - лично сам сталкивался не раз - когда возвращался чтобы изменить визуализированный эелемент и при этом полностью оставить бизнес логику
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879086
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

не вижу ничего плохого в использовании StaticResource - это использование возможностей платформы.

DataContext хорош в ситуациях с коллекциями данных.

авторDataContxt корневого элемента целпяют ViewModel
все верно, но нужно так же помнить DataTemplate - это песочница и ее нужно "пробивать"

авторВедь представь, ты решил сделать изменения.
Ведь как легко их делать и оперативно, когда у тебя эелемень цепляется к DataContext корневого эелемента, и когда на нем не висит куча разных Resource - лично сам сталкивался не раз - когда возвращался чтобы изменить визуализированный эелемент и при этом полностью оставить бизнес логику
здесь ты смешал "конфеты и котлеты" :)

View - представление
ViewModel - бизнес логика
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879090
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКаunknownfromrus,

авторВедь представь, ты решил сделать изменения.
Ведь как легко их делать и оперативно, когда у тебя эелемень цепляется к DataContext корневого эелемента, и когда на нем не висит куча разных Resource - лично сам сталкивался не раз - когда возвращался чтобы изменить визуализированный эелемент и при этом полностью оставить бизнес логику
здесь ты смешал "конфеты и котлеты" :)

View - представление
ViewModel - бизнес логика

Нет, в последнем случае я ничего не смешивал))
Представь, тебе говоряит руководство - будем менять кнопки на CustomControlы
Если у тебя такого много надо менять и у тебя будет много Resource, то тяжелее и медленее будешь делать изменение.
Другое дело DataContext от корневого эелемента.
Изменяешь control во view, ничего не знаю о соурсе - только знаешь что здесь у тебя будет такое то поле отображаться, такая то команда по такому событи подключается и т.п.
Что ни говори - а во втором случае проще и комфортнее.
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879173
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

только понял о чем ты.

ну это совсем малая рутина, которую при желании можно избежать командой в меню студии FindReplace :)
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879257
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКаunknownfromrus,

ну вот, говоришь человеку: "съешь этих сладких булочек"
а он: "я буду есть грязную вонючую собаку"



Ты все перепутал. StaticResource - жесткая связанность. Такие булочки никто не ест
...
Рейтинг: 0 / 0
DataTemplate ICommand
    #37879634
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

окей шеф, ешьте вашу собаку с медом.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataTemplate ICommand
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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