powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Про команды из Prism-Blend
41 сообщений из 41, показаны все 2 страниц
Про команды из Prism-Blend
    #38539374
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть в Призме такая штука, как возможность подключения команд через триггеры. Там добавляем две ссылочки

Код: xml
1.
2.
xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Interactivity;assembly=Microsoft.Practices.Prism.Interactivity"
xmlns:interactivity="http://schemas.microsoft.com/expression/2010/interactivity"



и делаем так

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<StackPanel>
    <interactivity:Interaction.Triggers>
        <interactivity:EventTrigger EventName="MouseDown">
            <interactivity:InvokeCommandAction
                Command="{Binding Path=MyCommand}" 
                CommandParameter="{Binding}" />
        </interactivity:EventTrigger>
    </interactivity:Interaction.Triggers>
</StackPanel>



А в коде пишем (с использованием DelegateCommand<T> из той же Призмы) так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private DelegateCommand<MyType> _myCommand;
public ICommand MyCommand
{
    get
    {
        if (_myCommand == null)
        {
            _myCommand = new DelegateCommand<MyType>(this.MyMethod);
        }
        return _myCommand;
    }
}

public void MyMethod(MyType commandParameter)
{
    ...
}





Так вот, вопрос - где это написано, что параметр метода MyMethod - это тот самый CommandParameter, который мы в XAML передавали? Я нигде не встречал, что они связаны. Пришлось долго биться, чтобы до этого допереть. Потому что в примерах, что я встречал, был простой случай без параметра - приделали команду и всё. Дайте, пожалуйста, ссылку на как можно более официальный текст, где сказано, что эти вещи именно связаны. Хочется поподробнее почитать.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38539822
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем тебе ссылка, у тебя уже есть DelegateCommand<MyType>, а в доках к prism подобные вопросы не освещаются, это фича mvvm, разница лишь в том, что в призм изначально заложен strong & weak reference
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38539902
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320где это написаноВ исходниках.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38539935
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreЗачем тебе ссылка, у тебя уже есть DelegateCommand<MyType>, а в доках к prism подобные вопросы не освещаются, это фича mvvm, разница лишь в том, что в призм изначально заложен strong & weak reference
То, что это DelegateCommand<MyType> - это моя приписка. Вообще, в примерах максимум делается примерно так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
private DelegateCommand<object> _myCommand;
public ICommand MyCommand
{
    get
    {
        if (_myCommand == null)
        {
            _myCommand = new DelegateCommand<object>(this.MyMethod);
        }
        return _myCommand;
    }
}

public void MyMethod(object something)
{
    var somethingElse = something as MyType;
    ...
}



Чувствуете разницу? Нигде нет отсылки, что та штука, которую мы в XAML в байндинге указываем в качестве CommandParameter и которая имеет тип MyType - это именно something, которую мы зачем-то специально потом приводим к типу MyType. Только по совпадению типов в байндинге и в приведении типа в MyMethod я до этого допёр. А вообще говоря, это неочевидно.

Максимум, что я видел, это something назовут parameter. И всё равно это неочевидно, что это параметр команды.

Вот вы с первого раза догадались, что это такое и как это использовать, или вас это даже не интересовало и вы просто переписали пример?


Алексей Кuser7320где это написаноВ исходниках.
В исходниках DelegateCommand<T> или в исходниках System.Windows.Interactivity.InvokeCommandAction? Т. е. надо декомпилировать System.Windows.Interactivity.InvokeCommandAction, а иначе не узнать?

Я вот смотрел
http://msdn.microsoft.com/en-us/library/system.windows.interactivity.invokecommandaction.commandparameter(v=expression.40).aspx
- нету ничего про это соответствие параметру в InvokeCommandAction.

Смотрел описание DelegateCommand<T>
Код: 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.
namespace Microsoft.Practices.Prism.Commands
{
    // Summary:
    //     An System.Windows.Input.ICommand whose delegates can be attached for Microsoft.Practices.Prism.Commands.DelegateCommand<T>.Execute(T)
    //     and Microsoft.Practices.Prism.Commands.DelegateCommand<T>.CanExecute(T).
    //      It also implements the Microsoft.Practices.Prism.IActiveAware interface,
    //     which is useful when registering this command in a Microsoft.Practices.Prism.Commands.CompositeCommand
    //     that monitors command's activity.
    //
    // Type parameters:
    //   T:
    //     Parameter type.
    //
    // Remarks:
    //     The constructor deliberately prevent the use of value types.  Because ICommand
    //     takes an object, having a value type for T would cause unexpected behavior
    //     when CanExecute(null) is called during XAML initialization for command bindings.
    //      Using default(T) was considered and rejected as a solution because the implementor
    //     would not be able to distinguish between a valid and defaulted values.
    //     Instead, callers should support a value type by using a nullable value type
    //     and checking the HasValue property before using the Value property.  public
    //     MyClass() { this.submitCommand = new DelegateCommand<int?>(this.Submit, this.CanSubmit);
    //     } private bool CanSubmit(int? customerId) { return (customerId.HasValue &&
    //     customers.Contains(customerId.Value)); }
    public class DelegateCommand<T> : DelegateCommandBase
    {
        // Summary:
        //     Initializes a new instance of Microsoft.Practices.Prism.Commands.DelegateCommand<T>.
        //
        // Parameters:
        //   executeMethod:
        //     Delegate to execute when Execute is called on the command. This can be null
        //     to just hook up a CanExecute delegate.
        //
        // Remarks:
        //     Microsoft.Practices.Prism.Commands.DelegateCommand<T>.CanExecute(T) will
        //     always return true.
        public DelegateCommand(Action<T> executeMethod);
        //
        // Summary:
        //     Initializes a new instance of Microsoft.Practices.Prism.Commands.DelegateCommand<T>.
        //
        // Parameters:
        //   executeMethod:
        //     Delegate to execute when Execute is called on the command. This can be null
        //     to just hook up a CanExecute delegate.
        //
        //   canExecuteMethod:
        //     Delegate to execute when CanExecute is called on the command. This can be
        //     null.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     When both executeMethod and canExecuteMethod ar null.
        public DelegateCommand(Action<T> executeMethod, Func<T, bool> canExecuteMethod);

        // Summary:
        //     Determines if the command can execute by invoked the System.Func<T,TResult>
        //     provided during construction.
        //
        // Parameters:
        //   parameter:
        //     Data used by the command to determine if it can execute.
        //
        // Returns:
        //     true if this command can be executed; otherwise, false.
        public bool CanExecute(T parameter);
        //
        // Summary:
        //     Executes the command and invokes the System.Action<T> provided during construction.
        //
        // Parameters:
        //   parameter:
        //     Data used by the command.
        public void Execute(T parameter);
    }
}


- тоже ничего нет про соответсвтие параметру в InvokeCommandAction.


Или вы имеете ввиду исходники, полученные в результате декомпиляции
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540007
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, я как-то этим вопросом не занимался, сказано ведь:
Код: c#
1.
2.
public class DelegateCommand<T> : ICommand 
public class DelegateCommand : ICommand


Все вроде понятно
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540008
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320В исходниках DelegateCommand<T> или в исходниках System.Windows.Interactivity.InvokeCommandAction? Т. е. надо декомпилировать System.Windows.Interactivity.InvokeCommandAction, а иначе не узнать?InvokeCommandAction. Тут проще взять рефлектор чем искать документацию.

DelegateCommand тоже посмотри, хуже не будет.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540015
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бывает и вот так передаю:
Код: c#
1.
CommandParameter="{Binding ElementName=assignedWindow}"


т.е. сразу целиком окно, затем выбираю окно или нужный контрол:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public ICommand CancelAssignCommand
        {
            get
            {
                if (_cancelAssignCommand == null)
                {
                    _cancelAssignCommand = new DelegateCommand<object>(OnCancelAssign, false);
                }
                return _cancelAssignCommand;
            }
        }

        protected void OnCancelAssign(object o)
        {
            (o as AssignedWindow).Close();
        }
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540049
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320В исходниках DelegateCommand<T> или в исходниках System.Windows.Interactivity.InvokeCommandAction? Т. е. надо декомпилировать System.Windows.Interactivity.InvokeCommandAction, а иначе не узнать?InvokeCommandAction. Тут проще взять рефлектор чем искать документацию.

DelegateCommand тоже посмотри, хуже не будет.
Когда проще взять Рефлектор - это говно.

DelegateCommand смотрел (привёл его описание выше в своём посте же) - ничего про InvokeCommandAction там нет. Я так понял, это две изначально несвязанные в общем случае... эмм... технологии, которые можно связать в частном случае, чтобы добиться желаемого.

TorreНе знаю, я как-то этим вопросом не занимался, сказано ведь:
Код: c#
1.
2.
public class DelegateCommand<T> : ICommand 
public class DelegateCommand : ICommand


Все вроде понятно
Как из этого понять, что InvokeCommandAction.CommandParameter это параметр метода делегата DelegateCommand<T>?

TorreЯ бывает и вот так передаю:
Код: c#
1.
CommandParameter="{Binding ElementName=assignedWindow}"


т.е. сразу целиком окно, затем выбираю окно или нужный контрол:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public ICommand CancelAssignCommand
        {
            get
            {
                if (_cancelAssignCommand == null)
                {
                    _cancelAssignCommand = new DelegateCommand<object>(OnCancelAssign, false);
                }
                return _cancelAssignCommand;
            }
        }

        protected void OnCancelAssign(object o)
        {
            (o as AssignedWindow).Close();
        }


Вы такой код сразу начали писать, как только увидели InvokeCommandAction, или кто-то вам подсказал, как надо делать и что там к чему?

И это, я не имел ввиду вообще команды, а именно InvokeCommandAction, которая даёт возможность прицеплять команды к событиям для элементов, для которых изначально в ванильном WPF привязка команд не предусмотрена.



Ну т. е. никто ни в каком МСДНе или ещё какой документации ничего подобного не находил, что InvokeCommandAction.CommandParameter и параметр метода делегата DelegateCommand<T> - это одно и то же? Всё через Рефлектор или через собственные нервы?
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540059
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Когда проще взять Рефлектор - это говно.Почему? Мне кажется, что хорошо написанная программа лучше любой документации, когда речь идёт о деталях реализации.
user7320Я так понял, это две изначально несвязанные в общем случае... эмм... технологии, которые можно связать в частном случае, чтобы добиться желаемого.Да
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540129
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не использую InvokeCommandAction, для DataTrigger достаточно свойства:
Код: c#
1.
 <DataTrigger Binding="{Binding MyProperty}" Value="True">
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540144
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreНе использую InvokeCommandAction, для DataTrigger достаточно свойства:
Код: c#
1.
 <DataTrigger Binding="{Binding MyProperty}" Value="True">


Вы так говорите, будто DataTrigger решает те же задачи, что и InvokeCommandAction и они взаимозаменяемы.

А если мне нужно выполнить код по клику (MouseDown) на какой-нибудь StackPanel, но в контексте MVVM?



Ладно, я разобрался и рад. А другие, особенно новички, пусть сами мучаются, хе-хе-хе. ))) Буду брать деньги за консультации. )))
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540218
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да это только начало, дальше длинная и извилистая прямая:
Код: c#
1.
<EventTrigger RoutedEvent="MouseEnter">
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540226
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreДа это только начало, дальше длинная и извилистая прямая:
Код: c#
1.
<EventTrigger RoutedEvent="MouseEnter">


Даже так?.. А как выглядит полный пример?

Зачем тогда InvokeCommandAction придумали?
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540385
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссылка
Код: 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.
<Style TargetType="Rectangle">
  <Setter Property="Width" Value="50" />
  <Setter Property="Height" Value="50" />
  <Setter Property="Margin" Value="20" />
  <Setter Property="HorizontalAlignment" Value="Left" />
  <Style.Triggers>
    <EventTrigger RoutedEvent="MouseEnter">
        <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation To="300" Duration="0:0:1.5" 
                AccelerationRatio="0.10" DecelerationRatio="0.25" 
                Storyboard.TargetProperty="(Canvas.Width)" />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
    <EventTrigger RoutedEvent="MouseLeave">
        <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Duration="0:0:1.5" 
                AccelerationRatio="0.10" DecelerationRatio="0.25" 
                Storyboard.TargetProperty="(Canvas.Width)" />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
  </Style.Triggers>
</Style>
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38540715
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Torre Ссылка
Код: 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.
<Style TargetType="Rectangle">
  <Setter Property="Width" Value="50" />
  <Setter Property="Height" Value="50" />
  <Setter Property="Margin" Value="20" />
  <Setter Property="HorizontalAlignment" Value="Left" />
  <Style.Triggers>
    <EventTrigger RoutedEvent="MouseEnter">
        <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation To="300" Duration="0:0:1.5" 
                AccelerationRatio="0.10" DecelerationRatio="0.25" 
                Storyboard.TargetProperty="(Canvas.Width)" />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
    <EventTrigger RoutedEvent="MouseLeave">
        <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Duration="0:0:1.5" 
                AccelerationRatio="0.10" DecelerationRatio="0.25" 
                Storyboard.TargetProperty="(Canvas.Width)" />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
  </Style.Triggers>
</Style>


Не вижу, где это (EventTrigger, DataTrigger) пересекается с функциональностью InvokeCommandAction и вообще командами. У меня есть модель представления (MVVM и всё такое), там есть метод или команда - как его (её) вызвать по событию MouseDown для контрола StackPanel?
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541358
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что сделать хочешь? Какое событие?
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541437
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreЧто сделать хочешь? Какое событие?
У меня есть модель представления (шаблон проектирования MVVM), там есть метод или команда - как его (её) вызвать по событию MouseDown для контрола StackPanel?
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541438
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreЧто сделать хочешь? Какое событие?
Я вот выше привёл пример с InvokeCommandAction

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<StackPanel>
    <interactivity:Interaction.Triggers>
        <interactivity:EventTrigger EventName="MouseDown">
            <interactivity:InvokeCommandAction
                Command="{Binding Path=MyCommand}" 
                CommandParameter="{Binding}" />
        </interactivity:EventTrigger>
    </interactivity:Interaction.Triggers>
</StackPanel>



Как сделать это же, но с вашим подходом? Они тоже использовали триггеры. Но к триггерам у них есть удобная добавка в виде назначения команды или метода, который нужно вызвать при событии, указанном в триггере. Также у них есть возможность передачи параметра (лучше бы было несколько, но конкретно у них такого нет, а в других реализациях я это видел) - это важно.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541439
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И понятно, что можно накодить самому. Но я так понимаю, у вас есть подход без "накодить самому" - чисто средствами ванильного WPF-XAML?
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541448
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А другие, особенно новички, пусть сами мучаются, хе-хе-хе.
И чего тут мучаться? Забиваем в гугл https://www.google.ru/search?q=Prism delegatecommand , по первой ссылке приходим сюда: http://msdn.microsoft.com/en-us/library/gg431410(v=pandp.40).aspx , переходим к хелпу по конструктору с перегрузкой DelegateCommand<T>(Action<T>): http://msdn.microsoft.com/en-us/library/gg405544(v=pandp.40).aspx - а там ясным английским языком написано, что
Код: c#
1.
2.
3.
public DelegateCommand(
	Action<T> executeMethod
)


executeMethod
Type: System.Action<T>
Delegate to execute when Execute is called on the command. This can be null to just hook up a CanExecute delegate.
Далее забывчивые могут открыть хелп по ICommand.Execute (DelegateCommand реализует ICommand - К.О.), и прочитать:
Код: c#
1.
2.
3.
void Execute(
	Object parameter
)


Parameters
parameter
Type: System.Object
Data used by the command. If the command does not require data to be passed, this object can be set to null.
Призмовцы просто сделали типизированную обертку, реализующую ICommand - перед передачей параметра в CanExecute/Execute он приводится к генерик-типу. Ну, и наконец:
InvokeCommandAction.CommandParameter :
Remarks
This is the value passed to ICommand.CanExecute and ICommand.Execute.
Хотя мне лично это всё было понятно и без путешествий по хелпам.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541462
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Ладно, я разобрался и рад. А другие, особенно новички, пусть сами мучаются, хе-хе-хе. ))) Буду брать деньги за консультации. )))Хоть в курсе про возможную утечку памяти при такой реализации DelegateCommand? :-)
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541464
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныПризмовцы просто сделали типизированную обертку, реализующую ICommand - перед передачей параметра в CanExecute/Execute он приводится к генерик-типу.Недоделали. Есть случай, когда "это" не работает. WPF пожет биндингом отправить в CommandParameter служебный объект, вроде DependencyProperty.UnsetValue. Таких объектов там несколько, все сейчас не вспомню. Приведение служебного объекта к типу T вызовет в этом месте ошибку:
Код: c#
1.
2.
3.
4.
bool ICommand.CanExecute(object parameter)        
{
    return this.CanExecute((T)parameter); // тут вероятна ошибка.
}


Нормальная реализация типизации параметра должна выглядеть как-то так: RelayCommandOfT , RelayCommandBase .
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        bool ICommand.CanExecute(object parameter) 
        {
            bool isValidParameter = 
                ParameterType == null || 
                (parameter == null && ParameterType.CanBeNull()) || 
                (parameter != null && ParameterType.IsAssignableFrom(parameter.GetType())); 
  
            if (isValidParameter) 
                return InvokeCanExecuteHandler(parameter); 
  
            return false; 
        } 
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541510
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНедоделали. Есть случай, когда "это" не работает. WPF пожет биндингом отправить в CommandParameter служебный объект, вроде DependencyProperty.UnsetValue. Таких объектов там несколько, все сейчас не вспомню.
Да, про эти недоделки и хелп пишет:
The constructor deliberately prevent the use of value types. Because ICommand takes an object, having a value type for T would cause unexpected behavior when CanExecute(null) is called during XAML initialization for command bindings. Using default(T) was considered and rejected as a solution because the implementor would not be able to distinguish between a valid and defaulted values.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541548
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныДа, про эти недоделки и хелп пишет:
The constructor deliberately prevent the use of value types. Because ICommand takes an object, having a value type for T would cause unexpected behavior when CanExecute(null) is called during XAML initialization for command bindings. Using default(T) was considered and rejected as a solution because the implementor would not be able to distinguish between a valid and defaulted values. Проблему с ValueType можно решить, используя Nullable<T>. Проблему с DependencyProperty.UnsetValue в их реализации решить не получится. Об этом они почему-то не пишут.

Сложившаяся ситуация мне чем-то напоминает проблемы, возникающие с DbNull.Value.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541644
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КDependencyProperty.UnsetValue

Сначала косячим, а потом делаем железный тазик, чтобы они не стучали по одному месту

msdnUnsetValue is a sentinel value that is used for scenarios where the WPF property system is unable to determine a requested DependencyProperty value. UnsetValue is used rather than null, because null could be a valid property value, as well as a valid (and frequently used) DefaultValue.

UnsetValue is never returned out of DependencyObject.GetValue. When you call DependencyObject.GetValue on a dependency property on a DependencyObject instance, one of the following applies:

•A dependency property has a default value established in metadata and that value is returned. This value might come from DefaultMetadata.


•Some other value was established by the property system, and the default value is no longer relevant. For details, see Dependency Property Value




ЗЫ 2TS, бессовестный МС заставил посмотреть исходники, я бы жаловался в Лигу наций

msdn<Button Command="{Binding Path=SubmitCommand}" CommandParameter="SubmitOrder"/>
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541660
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaСначала косячим, а потом делаем железный тазик, чтобы они не стучали по одному местуЗабинди CommandParameter через RelativeSource или забинди его на DataContext ItemContainer ItemsControl-а, если умеешь. :-)
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541678
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
user7320А другие, особенно новички, пусть сами мучаются, хе-хе-хе.

И чего тут мучаться? Забиваем в гугл https://www.google.ru/search?q=Prism delegatecommand , по первой ссылке приходим сюда: http://msdn.microsoft.com/en-us/library/gg431410(v=pandp.40).aspx , переходим к хелпу по конструктору с перегрузкой DelegateCommand<T>(Action<T>): http://msdn.microsoft.com/en-us/library/gg405544(v=pandp.40).aspx - а там ясным английским языком написано, что
Код: c#
1.
2.
3.
public DelegateCommand(
	Action<T> executeMethod
)


executeMethod
Type: System.Action<T>
Delegate to execute when Execute is called on the command. This can be null to just hook up a CanExecute delegate.
Далее забывчивые могут открыть хелп по ICommand.Execute (DelegateCommand реализует ICommand - К.О.), и прочитать:
Код: c#
1.
2.
3.
void Execute(
	Object parameter
)


Parameters
parameter
Type: System.Object
Data used by the command. If the command does not require data to be passed, this object can be set to null.
Призмовцы просто сделали типизированную обертку, реализующую ICommand - перед передачей параметра в CanExecute/Execute он приводится к генерик-типу. Ну, и наконец:
InvokeCommandAction.CommandParameter :
Remarks
This is the value passed to ICommand.CanExecute and ICommand.Execute.
Хотя мне лично это всё было понятно и без путешествий по хелпам.
Спасибо. Вот это я и хотел. Видно, сам я ещё не настолько умный, чтобы это связать сразу.

Алексей Кuser7320Ладно, я разобрался и рад. А другие, особенно новички, пусть сами мучаются, хе-хе-хе. ))) Буду брать деньги за консультации. )))Хоть в курсе про возможную утечку памяти при такой реализации DelegateCommand? :-)
А при такой ?

Кстати, у меня там в английском варианте вся разметка кода скомкана в один абзац на любых браузерах. В русском всё ОК. А у вас?
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541688
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Алексей Кпропущено...
Хоть в курсе про возможную утечку памяти при такой реализации DelegateCommand? :-)
А при такой ?

Кстати, у меня там в английском варианте вся разметка кода скомкана в один абзац на любых браузерах. В русском всё ОК. А у вас?При такой нормально. Там ключевой момент:
Код: c#
1.
2.
3.
4.
5.
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }


Событие CommandManager.RequerySuggested в WPF реализовано через Weak Event Pattern.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541702
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЗЫ 2TS, бессовестный МС заставил посмотреть исходники, я бы жаловался в Лигу наций

msdn<Button Command="{Binding Path=SubmitCommand}" CommandParameter="SubmitOrder"/>


Не понял.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38541707
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЗЫ 2TS, бессовестный МС заставил посмотреть исходники, я бы жаловался в Лигу наций

пропущено...

Меня немного удивляет, когда с одной стороны говорят о всяких интерфейсах и инкапсуляции и прочих ништяках, а с другой "а-ха-ха, не можешь даже в исходниках разобраться!!".
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542184
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaСначала косячим, а потом делаем железный тазик, чтобы они не стучали по одному местуЗабинди CommandParameter через RelativeSource или забинди его на DataContext ItemContainer ItemsControl-а, если умеешь. :-)

Делал это неоднократно, но только подобного никогда не наблюдал, тк не было мультов с dependencyproperty, которые шастают за даннами как у тебя.
Процедура простая:
инициализируем асинхронную загрузку данных, не дожидаясь ее выполнения создаем view, отдаем его сервису навигации для показа, после того как данные получены, создается viewmodel, который привязываем к DataContext.

Таким образом ничего не стучит и не гремит, тазик не нужен.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542190
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320SeVaЗЫ 2TS, бессовестный МС заставил посмотреть исходники, я бы жаловался в Лигу наций

пропущено...

Меня немного удивляет, когда с одной стороны говорят о всяких интерфейсах и инкапсуляции и прочих ништяках, а с другой "а-ха-ха, не можешь даже в исходниках разобраться!!".

А меня удивляют те, кто считают, что им кто-то обязан что-то разжевывать.
Я еще не видел полной документации к чему-либо, а посему помогают только примеры и исходники.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542258
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaАлексей Кпропущено...
Забинди CommandParameter через RelativeSource или забинди его на DataContext ItemContainer ItemsControl-а, если умеешь. :-)

Делал это неоднократно, но только подобного никогда не наблюдал, тк не было мультов с dependencyproperty, которые шастают за даннами как у тебя.
Процедура простая:
инициализируем асинхронную загрузку данных, не дожидаясь ее выполнения создаем view, отдаем его сервису навигации для показа, после того как данные получены, создается viewmodel, который привязываем к DataContext.

Таким образом ничего не стучит и не гремит, тазик не нужен.
Тынц 4.0

Тынц 4.5
автор5- Checking for a valid DataContext object. There are cases where the DataContext of an item container in an ItemsControl becomes disconnected. An item container is the UI element that displays an item in an ItemsControl. When an ItemsControl is data bound to a collection, an item container is generated for each item. In some cases, item containers are removed from the visual tree. Two typical cases where an item container is removed are when an item is removed from the underlying collection and when virtualization is enabled on the ItemsControl. In these cases, the DataContext property of the item container will be set to the sentinel object that is returned by the BindingOperations.DisconnectedSource static property. You should check whether the DataContext is equal to the DisconnectedSource object before accessing the DataContext of an item container.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542344
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaпропущено...


Делал это неоднократно, но только подобного никогда не наблюдал, тк не было мультов с dependencyproperty, которые шастают за даннами как у тебя.
Процедура простая:
инициализируем асинхронную загрузку данных, не дожидаясь ее выполнения создаем view, отдаем его сервису навигации для показа, после того как данные получены, создается viewmodel, который привязываем к DataContext.

Таким образом ничего не стучит и не гремит, тазик не нужен.
Тынц 4.0

Тынц 4.5
автор5- Checking for a valid DataContext object. There are cases where the DataContext of an item container in an ItemsControl becomes disconnected. An item container is the UI element that displays an item in an ItemsControl. When an ItemsControl is data bound to a collection, an item container is generated for each item. In some cases, item containers are removed from the visual tree. Two typical cases where an item container is removed are when an item is removed from the underlying collection and when virtualization is enabled on the ItemsControl. In these cases, the DataContext property of the item container will be set to the sentinel object that is returned by the BindingOperations.DisconnectedSource static property. You should check whether the DataContext is equal to the DisconnectedSource object before accessing the DataContext of an item container.

По ссылкам описаны мульти-пульти для твоих любимых проперти, которым нужна подписка на события ui.
Чтобы не было подобной головной боли и придумали viewmodel.
Еще одно подтверждение тому, что сначала придумываем себе трудности, а потом героически их преодалеваем, изучая доки msdn c моментами, когда у wpf сносит крышу
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542421
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVauser7320пропущено...

Меня немного удивляет, когда с одной стороны говорят о всяких интерфейсах и инкапсуляции и прочих ништяках, а с другой "а-ха-ха, не можешь даже в исходниках разобраться!!".

А меня удивляют те, кто считают, что им кто-то обязан что-то разжевывать.
Я еще не видел полной документации к чему-либо, а посему помогают только примеры и исходники.
Да-да, если бы были полные документации, то евангелисты и, в конечном счёте, корпорации, не смогли бы продавать свои книжонки и зарабатывать дополнительную денежку. А с исходниками - как с линуксами: "вы можете бесплатно скачать или декомпилировать и разобраться долгими ночами в наших исходниках, если ваше время ничего не стоит". А можете купить наших книжек и посетить наши семинары, где наши специалисты сразу укажут вам на пару узких мест и героические методы их преодоления... за умеренную плату, канеш...

Кстати, ещё неясно, с чего корпорации больше имеют - с вижуал студий всяких или с курсов-семинаров-книжонок. И это, "я заработал миллионы на курсах как "заработать миллионы"" ещё никто не отменял.

Ну типа это был "хнык-хнык".
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542442
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaПо ссылкам описаны мульти-пульти для твоих любимых проперти, которым нужна подписка на события ui.Там про значение DataContext и ItemContainer с включенной виртуализацией. А английский язык учи - пригодится!
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542445
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Ну типа это был "хнык-хнык".Хватит ныть!
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542862
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSeVaПо ссылкам описаны мульти-пульти для твоих любимых проперти, которым нужна подписка на события ui.Там про значение DataContext и ItemContainer с включенной виртуализацией. А английский язык учи - пригодится!

С документацией все понятно, а при чем старая калоша, которую ты упоминаешь, нет.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38542997
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaАлексей Кпропущено...
Там про значение DataContext и ItemContainer с включенной виртуализацией. А английский язык учи - пригодится!

С документацией все понятно, а при чем старая калоша, которую ты упоминаешь, нет.Представь что будет, если на вход этого:
Код: c#
1.
2.
3.
4.
bool ICommand.CanExecute(object parameter)        
{
    return this.CanExecute((T)parameter); // тут вероятна ошибка.
}

в качестве параметра придёт служебный объект, обозначающий отсоединённость ItemContainer.

В WPF DataGrid аналогичная ситуация с фиктивной записью, которая обозначает дополнительную строку для добавляемой записи. Эту фиктивную запись можно отличить так :
Код: c#
1.
2.
3.
4.
        public static bool IsNewItemPlaceholder(object item) 
        { 
            return item != null && item.ToString() == "{NewItemPlaceholder}"; 
        } 


В сложившейся ситуации мне кажется разумным иметь в CanExecute дополнительную проверку на тип объекта, передаваемого в качестве параметра, которую я описал выше.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38543049
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рисуем правильную команду(вернее, берем готовую из призм)
Код: c#
1.
2.
3.
4.
bool ICommand.CanExecute(T parameter)        
{
    return base.CanExecute(parameter); // тут объект на входе.
}



И если даже стучит, то и Бог с ней. Нет никого криминала, что не будет никаких телодвижений на то, чего уже нет.
...
Рейтинг: 0 / 0
Про команды из Prism-Blend
    #38543052
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ Любителям собственных велосипедов, CommandDelegate из нового призм будет в стандартной поставке bcl.portable
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Про команды из Prism-Blend
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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