Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Заморочка интересная с WPF binding

1981  1 2 3 4 5 6 все
  moose коренной житель04.12.20 22:03
NEW 04.12.20 22:03 
в ответ AlexNek 04.12.20 18:33
Сорри, тогда я так и не понял что именно вы хотели там пояснить.

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


Ну если вы изложите точно что вам требуется, я еще могу попробовать сделать пример.

зачем? вы ведь уже поняли?


Хотите контрол с двумя кнопочками, управляемый внешним объектом?


не знаю, что это такое, но очень хочу : )

#21 
AlexNek патриот04.12.20 22:15
AlexNek
NEW 04.12.20 22:15 
в ответ moose 04.12.20 22:03, Последний раз изменено 04.12.20 22:16 (AlexNek)
логичным было бы начать с того, что не понял

сразу первый пост

Сорри, что написано вроде как понятно, но в чем проблема так и не понял.
не знаю, что это такое, но очень хочу



В приложении архив. экзешник не удалял. Сделано всё исключительно для примера.
#22 
  moose коренной житель04.12.20 22:34
NEW 04.12.20 22:34 
в ответ AlexNek 04.12.20 22:15

спасибо, завтра рассмотрю и отпишусь

#23 
AlexNek патриот04.12.20 22:46
AlexNek
NEW 04.12.20 22:46 
в ответ moose 04.12.20 22:34

Да не за что. Я только до сих и не знаю правильно Вас понял или нет. С одной стороны вроде бы да, а судя по реакции нет.

Специально сделал DepencyProperty принимающий объект, который присваивается только раз, но вот менять состояние этого объекта можно сколько угодно. По крайней мере, именно так я понял Вашу проблему.

Если что не так, меняйте как требуется, бум разбираться дальше.

#24 
  moose коренной житель05.12.20 14:51
NEW 05.12.20 14:51 
в ответ AlexNek 04.12.20 22:46, Последний раз изменено 05.12.20 15:54 (moose)

посмотрел. не заработало, пока не добавил в хамле основного окна DataContext ("нормальный", не DesignInstance).

после этого заработало. клацаешь на чекбоксы, клавиши появляются/исчезают.

но мне кажется, было бы проще и понятней вместо создания DependencyProperty в SampleUserControl.cs (лишнего, мне кажется), просто описать в MainWindow.xaml этот контрол вот так


    <Views:SampleUserControl DataContext="{Binding StateContainerMain}" />


и будет достигнута та же цель: присвоение контролу DataContext.

кроме того, я начинал всю эту ветку о том, как срабатывает изменение OnPropertyChanged, где property - DependencyProperty типа object. мне кажется, Visibility - это enum, и срабатывает все как и в случае примитива.

т.е. я не понял, что этот пример мне хотел продемонстрировать/предложить.


но посмотреть было интересно. еще раз спасибо : )


#25 
AlexNek патриот05.12.20 16:37
AlexNek
NEW 05.12.20 16:37 
в ответ moose 05.12.20 14:51
посмотрел. не заработало, пока не добавил в хамле основного окна DataContext ("нормальный", не DesignInstance).

Странно и ехе не заработало? DesignInstance я для решарпера делаю. Код и ехе от одного бильда.


но мне кажется, было бы проще и понятней вместо создания DependencyProperty

Ну так специально ради использования DependencyProperty и сделал и специально указал, что пример. Я так никогда и не делаю


как срабатывает изменение OnPropertyChanged, где property - DependencyProperty типа object

Смысл остается тем же, нужно еще что то, что говорит об изменении самого объекта.

Сделаем и с объектом... тоже есть варианты, возьмем, как говорите, самый дебильный смущ

#26 
  moose коренной житель05.12.20 16:39
NEW 05.12.20 16:39 
в ответ moose 05.12.20 14:51

еще одна заморочка. пишем


EventManager.RegisterClassHandler(typeof(Window), System.Windows.Controls.Control.KeyDownEvent, new KeyEventHandler(keyDown), true);

keyDown выглядит так:

void keyDown(object sender, KeyEventArgs e) {

как узнать, который из альтов был нажат, левый или правый? в e.KeyboardDevice.Modifiers в обоих случаях стоит просто Alt. ясно, можно опросить все клавиши на предмет нажата или нет, но это неудобно, хотелось бы попроще. может, в этом "е" вся инфа уже имеется, я ее просто не вижу?

#27 
  moose коренной житель05.12.20 16:44
NEW 05.12.20 16:44 
в ответ AlexNek 05.12.20 16:37, Последний раз изменено 05.12.20 16:45 (moose)

я не призываю вас делать "дебильные вещи". и вообще никаких вопросов в моем первом посту не содержится. я просто опыт свой печальный описал. вижу, для вас то, что мне было неизвестно, просто очевидно. молодец! вайтер зо! : )

#28 
AlexNek патриот05.12.20 22:18
AlexNek
NEW 05.12.20 22:18 
в ответ moose 05.12.20 16:44

Переделал на object, вариант 2, вариант 1 старый. Ехе оставил

#29 
AlexNek патриот05.12.20 23:04
AlexNek
NEW 05.12.20 23:04 
в ответ moose 05.12.20 16:39


#30 
  moose коренной житель06.12.20 16:49
NEW 06.12.20 16:49 
в ответ AlexNek 05.12.20 23:04

это то, что видно при нажатии алта. без проблем, но это мне известно и не нужно. вы скажите, как при нажатии, скажем, клавиши 'A' определить, нажат ли при этом ПРАВЫЙ алт? я не хочу запоминать его состояние когда его опускают-поднимают.

но мне уже это просто интересно, но не необходимо, я совсем другое решение придумал.

#31 
AlexNek патриот06.12.20 20:06
AlexNek
NEW 06.12.20 20:06 
в ответ moose 05.12.20 16:39
в e.KeyboardDevice.Modifiers в обоих случаях стоит просто Alt

А у меня нет смущ

Левый alt = Alt Правый alt = ALT, Control


Можно еще и так проверить, но надежного способа пока не нашел. Чтобы работал при любой последовательности нажатий.

KeyStates keyState1 = e.KeyboardDevice.GetKeyStates(Key.LeftAlt);

KeyStates keyState2 = e.KeyboardDevice.GetKeyStates(Key.RightAlt);

#32 
MrSanders коренной житель06.12.20 20:22
NEW 06.12.20 20:22 
в ответ AlexNek 06.12.20 20:06
Левый alt = Alt Правый alt = ALT, Control

Потому что раскладка немецкая. А правый Alt на немецкой вовсе даже Alt Gr. А если переключить на английскую раскладку, то будет и левый и правый Alt.

#33 
AlexNek патриот06.12.20 20:37
AlexNek
NEW 06.12.20 20:37 
в ответ MrSanders 06.12.20 20:22
Потому что раскладка немецкая.

не а. Винда английская, а раскладка была русской, да и не зависит от раскладки. Только что попереключал.

#34 
Программист коренной житель07.12.20 08:32
NEW 07.12.20 08:32 
в ответ MrSanders 04.12.20 16:05
Это не спортивно! Оно не само! :)

Ты полагаешь, что

OnPropertyChanged ("person");

делает что-то другое? улыб

#35 
MrSanders коренной житель07.12.20 09:24
NEW 07.12.20 09:24 
в ответ AlexNek 06.12.20 20:37
не а. Винда английская, а раскладка была русской, да и не зависит от раскладки. Только что попереключал.

Значит не от раскладки, давно я не брал в руки шашек. Но Alt+Ctrl вместо правого альта посылают "немецкие" клавиатуры у которых Alt Gr вместо правого Alt.

#36 
MrSanders коренной житель07.12.20 09:30
NEW 07.12.20 09:30 
в ответ Программист 07.12.20 08:32
делает что-то другое? улыб

Ну оно же должно само ещё и внутри person-а за всеми полями следить!

В этом же расстройство было. Вешаем OnChange на проперть person и возмущаемся а почему оно само не следит что у объекта, на который указывает person, пропертя меняются.

А ты предлагаешь самому, ручками за person.age следить. Ни стыда ни совести! :)

#37 
Программист коренной житель07.12.20 10:33
NEW 07.12.20 10:33 
в ответ MrSanders 07.12.20 09:30
А ты предлагаешь самому, ручками за person.age следить. Ни стыда ни совести! :)

Не предлагаю :) Код 1 в 1 как у moose:

    _person.Age++;
    OnPropertyChanged ("person");


и мой:

_person.Age++;
PropertyChanged(this, new PropertyChangedEventArgs("Person"));


В чем тут разница? :)


PS: Person в моем примере не унаследована от INotifyPropertyChanged (если ты об этом)

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string n, int a)
{
Name = n;
Age = a;
}
}
#38 
AlexNek патриот07.12.20 12:47
AlexNek
NEW 07.12.20 12:47 
в ответ MrSanders 07.12.20 09:24
Но Alt+Ctrl вместо правого альта посылают "немецкие" клавиатуры

Скорее всего именно так. С клавой еще не извращался. смущ

#39 
AlexNek патриот07.12.20 12:54
AlexNek
NEW 07.12.20 12:54 
в ответ Программист 07.12.20 10:33
PropertyChanged(this, new PropertyChangedEventArgs("Person"));

Для демки, конечно никакой разницы. Но иметь такое в нормальной проге шок


Обычно так

PropertyChanged();

Раньше было так

PropertyChanged(nameof(Person));

В разных расширениях может быть еще встроенная проверка на ==, соответсвенно количество аргументов чуть больше

#40 
1 2 3 4 5 6 все