• Как сделать привязку в WPF MVVM к динамическому списку CheckBox?

    phoenixbk
    @phoenixbk
    Можно примерно так сделать:
    public class HobbyCheckBoxItem
    {
    	private readonly User _user;
    
    	public HobbyCheckBoxItem(User user, Hobby hobby)
    	{
    		_user = user;
    		Hobby = hobby;
    		_isChecked = user.Hobbies.Contains(hobby);
    	}
    
    	public Hobby Hobby { get; }
    
    	private bool _isChecked;
    
    	public bool IsChecked
    	{
    		get => _isChecked;
    		set
    		{
    			if (_isChecked == value) return;
    			_isChecked = value;
    			if (value) _user.Hobbies.Add(Hobby);
    			else _user.Hobbies.Remove(Hobby);
    			// save db
    		}
    	}
    }

    И в биндинге CheckBox тогда будет не Content="{Binding Name}", а Content="{Binding Hobby.NameFull}"
    Ответ написан
    Комментировать
  • Как передать в шаблон стиля DataContext?

    phoenixbk
    @phoenixbk
    Создаём стиль:
    <Style x:Key="TestButtonStyle" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Text="{Binding}"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    Применяем стиль:
    <Button DataContext="Some text" Style="{StaticResource TestButtonStyle}" />
    Ответ написан
    Комментировать
  • Почему не запускается проект на .NET MAUI C#?

    phoenixbk
    @phoenixbk
    Потому что в штатном примере на событие клика изменяется содержимое кнопки на количество кликов по ней. В файле MainPage.xaml.cs есть метод OnCounterClicked. Он вызывается при нажатии на кнопку с названием CounterBtn. И при нажатии на кнопку при помощи свойства CounterBtn.Text меняется содержимое кнопки. А так как вы удалили эту кнопку, то ссылка по имени кнопки ссылается на несуществующий объект. Из-за этого компилятор выдаёт ошибку и не может собрать приложение. Удалите/закомментируйте этот метод целиком или только его тело и приложение запустится.
    Ответ написан
    Комментировать
  • Не корректное отображение кнопки WPF?

    phoenixbk
    @phoenixbk
    Вы указали большие отступы справа и снизу. В результате из-за них размер кнопки может быть меньше, чем вы указали (в зависимости от размера родителя, в данном случае окна). Вы можете выставить отступы справа и снизу в 0 и указать горизонтальное выравнивание слева и вертикальное сверху:
    <Button x:Name="btn" Content="Нажать!!!" Width="150" Height="45" Margin="45,49,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Click="btn_Click"/>
    Ответ написан
    Комментировать
  • Как быть с PasswordBox в WPF?

    phoenixbk
    @phoenixbk
    Я использовал данный код - https://github.com/grumpydev/hotwire/blob/master/H....
    Пример использования:
    <PasswordBox
        uiHelpers:PasswordBoxAssistant.BindPassword="True"
        uiHelpers:PasswordBoxAssistant.BoundPassword="{Binding ServerPassword, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    Ответ написан
    Комментировать
  • Если открыт весь 22 порт, безопастно ли запускать сервер в интернет?

    phoenixbk
    @phoenixbk
    Больше года у меня VPS. На порт SSH ломились, но не сильно часто судя по логам. Во всяком случае каких-то существенных нагрузок я не заметил. Ну и насколько я понял в Ubuntu Server есть автоматическая блокировка новых попыток входа при определенном количестве неверных логинов/паролей. Не настраивал, оставил как есть.
    Но на всякий случай добавил в SSH 2FA.
    https://www.linuxbabe.com/ubuntu/two-factor-authen...
    Пусть теперь хоть заломаются :)
    PS Количество попыток входа по дням:
    5099 Jul 6
    5496 Jul 7
    4094 Jul 8
    5867 Jul 9
    4378 Jul 10
    6326 Jul 11
    6585 Jul 12
    7481 Jul 13
    4505 Jul 14
    Ответ написан
    Комментировать
  • Как лучше обновить summary у модифицированного EditTextPreference с установленным SimpleSummaryProvider?

    phoenixbk
    @phoenixbk Автор вопроса
    Посмотрел исходники Android (EditTextPreferenceDialogFragmentCompat.java) - как диалог изменения настройки оповещает EditTextPreference об изменении значения. Сделал также и всё заработало :)
    if (editTextPreference().callChangeListener(value)) {
        editTextPreference().setText(value);
    }
    Ответ написан
    Комментировать
  • Как настроить роутинг для главной с табами?

    phoenixbk
    @phoenixbk
    Я у router-link делал динамическую ссылку (у меня правда query string, но думаю с # можно сделать аналогично):
    <router-link :to="{path:'/', query: query}">Home</router-link>

    А query уже заполнял в зависимости от текущей страницы. Если "/", то тогда подставляем query string из адреса. Если другая страница, то query пустой. Таким образом как бы query string не обновлялся на главной ссылка всегда будет активной.
    PS где-то встречал что вроде как в новой версии можно будет настроить router-link так, чтоб он игнорировал query string и прочее при определении активности ссылки. Тогда можно будет обойтись без костылей.
    Ответ написан
    Комментировать
  • Нету провайдера SQLite в Мастере моделей EDM при выборе источника данных, как его поставить?

    phoenixbk
    @phoenixbk
    К сожалению SQLite пока не поддерживает design-time режим. Есть только базовая поддержка сборки и тестирования.
    https://system.data.sqlite.org/index.html/tktview?...
    Можно попробовать исправить это немного пошаманствуя - https://github.com/ErikEJ/SqlCeToolbox/wiki/EF6-wo... Но это решешение только для EF6.
    Ответ написан
    Комментировать
  • Когда делать ORM mapping?

    phoenixbk
    @phoenixbk
    В своем приложении вы описываете объекты хранения в виде ООП классов. Далее, при работе с этими объектами в Python, система ORM транслирует объектные взаимодействия в SQL в соответствии с указанным провайдером.
    Например, print(Person[person_id].name) сгенерирует следующий SQL код для SQLite:
    SELECT "id", "name", "age"
    FROM "Person"
    WHERE "id" = ?

    Где вместо вопроса подставит указанный person_id. Он выполнится в SQLite, вернет данные в ORM и она уже выдаст нам запрошенные данные в виде объекта Person, из которого в данном случае мы выводим имя.
    И это будет работать так независимо от того, первый раз вы запускаете приложение или сотый.
    На официальной странице Pony ORM все довольно понятно расписано в разделе первые шаги:
    Getting Started with Pony
    Для понимания взаимодействия ORM с базой данных советую включить отладочный режим: set_sql_debug(True). В это случае в консоль будет выводиться все взаимодействие с БД.
    Ответ написан
    Комментировать
  • Как создать фильтрацию в привязанной коллекции в WPF?

    phoenixbk
    @phoenixbk
    Есть ещё вариант использовать CollectionViewSource:
    CollectionViewSource _viewSource = new CollectionViewSource();
    _viewSource.Source = _items;
    _viewSource.Filter += (s, e) =>
                  {
                      SomeItem item = e.Item as SomeItem;
                      bool accepted;
                      //проверяем наши условия. true - объект отобразится, false - не отобразится
                      e.Accepted = accepted;
                  };

    Чтобы обновить список элементов используем:
    _viewSource.View.Refresh();
    После этого для каждого элемента из _items вызовется событие Filter.
    Соответственно в ComboBox.ItemsSource биндим _viewSource.View. Таким образом в ComboBox не придется каждый раз вручную вставлять новую коллекцию.
    Ответ написан
    Комментировать
  • Не могу запустить модуль PyQt4. Что делать?

    phoenixbk
    @phoenixbk
    Проверьте чтоб путь (...Python34\Lib\site-packages\PyQt4) до PyQt4 был добавлен в переменной среды Path.
    Ответ написан
    Комментировать
  • PyQt 5: условие с QLabel.setText() не меняет значение на форме, как исправить?

    phoenixbk
    @phoenixbk
    Здравствуйте!
    А где "groupBox" добавляется в окно? Сделал простенький вариант с классном на основе QWidget. Всё отображается как надо.
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QGroupBox, QVBoxLayout, QLabel, QPushButton
    
    class Example(QWidget):
        def __init__(self):
            super().__init__()
            l = QVBoxLayout()
            b = QPushButton('Добавить без параметра!')
            b.clicked.connect(lambda: self.function1())
            b2 = QPushButton('Добавить с параметром!')
            b2.clicked.connect(lambda: self.function1(args='параметр'))
            l.addWidget(b)
            l.addWidget(b2)
            self.setLayout(l)
            self.show()
    
        def function1(self, args=None):
            groupBox = QGroupBox("Титле")
            vbox = QVBoxLayout()
            vbox.addStretch(1)
            groupBox.setLayout(vbox)
    
            integerLabel = QLabel('test')
            vbox.addWidget(integerLabel)
            print('свойство сейчас:' + integerLabel.text())
            if args is not None:
                integerLabel.setText('1')
                print('Тест попадения функции')
                print('Поменялось на:' + args)
            print('свойство сейчас 2:' + integerLabel.text())
            self.layout().addWidget(groupBox)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = Example()
        w.resize(250, 150)
        w.setWindowTitle('Simple')
        w.show()
        sys.exit(app.exec_())
    Ответ написан
    1 комментарий