Ответы пользователя по тегу XAML
  • В ListView не отображаются данные из ObservableCollection и XAML отказывается делать Binding. Как исправить?

    FoggyFinder
    @FoggyFinder
    Вы используете компилируемые привязки, а значит нужно указывать тип в явном виде и для дочерних элементов. По крайней мере до тех пор пока это не будет исправлено в XF

    Adding x:DataType to a ContentPage breaks nested o...

    Так что чтобы исправить проблему достаточно просто добавить

    x:DataType="vm:MedicineViewModel"

    чтобы было понятнее привожу контекст

    <ListView.ItemTemplate>
        <DataTemplate x:DataType="vm:MedicineViewModel">
            <ViewCell>
                <ViewCell.View>
                    <StackLayout>
                        <Label FontSize="Large" Text="{Binding Title}" />
                        <Label FontSize="Small" Text="{Binding Format}" />
                        <Label FontSize="Small" Text="{Binding Method}" />
                    </StackLayout>
                </ViewCell.View>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>


    И позвольте дать пару советов которые не относятся непосредственно к ответу

    1. В процессе работы над проектов время от времени запрашивайте CodeReview, так код будет чище и вы сможете "расти" быстрее.

    2. Не отправляйте в гит секретные ключи. Пока проект учебный это не так и страшно, но лучше проявлять осмотрительность как можно раньше.

    3. Когда сталкиваетесь с проблемой (а такое всенепременно будет) не тащите в вопрос код из своего проекта, лучше создайте маленький тестовый проект где не будет ничего лишнего. На первый взгляд это лишняя трата времени, но во многих случаях вы докопаетесь до сути проблемы во время подготовки такого MCVE.
    Ответ написан
    4 комментария
  • Как в WPF фильтровать двойной клик по ListView только левой кнопкой?

    FoggyFinder
    @FoggyFinder
    Можно пойти разными способами:

    1. Использовать InputBinding, а именно MouseBinding. Тут LeftDoubleClick один из вариантов отслеживаемых действий, посмотреть весь список можно тут

    2. Использовать CallMethodAction вместо InvokeCommandAction, тогда вы сможете учитывать аргументы события.
    Сигнатура метода должна быть точно такая же как если бы вы обрабатывали событие в View части.

    3. Поискать реализацию (или написать самостоятельно) EventToCommand где будет метод PassEventArgsToCommand (с корректной реализацией)
    Ответ написан
    2 комментария
  • Как обработать событие в рамках MVVM через Interactions.Triggers у подключенной библиотеки?

    FoggyFinder
    @FoggyFinder
    Написать свой триггер для учета прикрепляемых событий. Как, например, сделано тут:

    https://sergecalderara.wordpress.com/2012/08/23/ho...

    или тут
    Ответ написан
    3 комментария
  • Как правильно указать DataContext в UserControl MVVM?

    FoggyFinder
    @FoggyFinder
    Проблема не с назначением DataContext для UserControl. Для связывания команды с кнопкой используется свойство Command а не Click:

    <Button Command="{Binding OpenDataBaseEditorView}">Open</Button>
    Ответ написан
  • Как связать свойство Command Parameter у Context Menu со свойством Name у TextBox, к которому это меню привязано?

    FoggyFinder
    @FoggyFinder
    Вы столкнулись с широко известной проблемой привязки в ContextMenu, ToolTip из-за того что эти элементы не являются частью "визуального" дерева (visual tree).

    В таких случаях предлагается два стандартных решениях - использовать PlacementTarget и прокси-объект. Первое тут должно подойти идеально.

    Прежде чем показать код отмечу, что вместо использования свойства Name в качестве ключа TextBox лучше использовать свойство Tag.

    То есть вместо:

    <TextBox Name="Box_110" ...>

    <TextBox Tag="Box_110" ...>

    Это не принципиальное изменение, но в большинстве ответов для подобных случаев вы встретите использование именно свойство Tag.

    С учетом этого привязка для CommandParameter будет выглядеть вот так:

    <Setter Property="CommandParameter" Value="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" />


    И немного оффтопа:

    В вашем обработчике ContextMenuClick вы используете постоянное смещение равное 10 и код по сути для каждого кейса одинаков. Вы могли бы сократить код, предварительно заменив подсказку в Tag убрав оттуда префикс "Box_" чтобы получилось что-то подобное:

    public void ContextMenuClick(object param)
    {
        if (int.TryParse(Convert.ToString(param), out int v))
        {
            StampDictionary.TextBoxes[v.ToString()].BoxValue = Name;
            StampDictionary.TextBoxes[(v + 10).ToString()].BoxValue = Signature;
        }
    }


    Если все ключи в словаре числовые, то еще проще будет заменит тип ключа на int.
    Ответ написан
    2 комментария
  • Как динамически менять значение TextBox, если Binding идет через Dictionary?

    FoggyFinder
    @FoggyFinder
    Чтобы сообщить представлению (View) об изменении значения конкретного свойства из VM нужно передать его название в виде параметра:

    OnPropertyChanged(nameof(TextBoxes));

    Непосредственно в самих свойствах вы можете увидеть что идет вызов без передачи параметров:

    OnPropertyChanged();

    Дело в том, что в типичной реализации имя свойства извлекается при помощи атрибута CallerMemberName:

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
    // ...
    }


    Это не обязательно делать в set. У свойства может не быть открытого сеттера или не быть сеттера вообще. Или если свойство зависит от двух других - например, для автоматического отображения суммы значений, которые должен вводить пользователь.

    В вашем случае с TextBoxes вы не используете сеттер - его можно даже совсем убрать.
    Ответ написан
    2 комментария
  • Как привязать данные таблицы к Combobox?

    FoggyFinder
    @FoggyFinder
    Все правильно, хотя, возможно, вам больше по душе придется стандартный ComboBox, а не
    DataGridComboBoxColumn:

    <DataGridTemplateColumn Header="Должность">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox
                     HorizontalContentAlignment="Center"
                     ItemsSource="{Binding DataContext.Titles, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                     SelectedItem="{Binding Title}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>


    Будьте внимательны, в примере выше предполагается, что
    коллекция Titles находится на том же уровне (классе), что и коллекция Employee.
    Ответ написан
    Комментировать
  • Можно ли на WPF создавать самостоятельные приложения для частного использования?

    FoggyFinder
    @FoggyFinder
    Поняла, да не до конца. Что еще нужно, чтобы сделать цельное приложение


    Все зависит от самого приложения.

    Назовите плиз примеры из жизни для приложений, которые можно написать используя это фреймворк.


    Их очень много. Приведу несколько OpenSource приложений которые использую или использовал раньше:

    Snoop
    ScreenToGif
    MarkdownMonster
    LiteDbExplorer

    Эти приложения могут индивидуально писаться под заказ как сайты к примеру


    Могут и пишутся.
    Ответ написан
    Комментировать