Рейтинг@Mail.ru

Почему ComboBox сбрасывает выбранный элемент SelectedItem при двунаправленной привязке?

Published in Полезные советы

Почему ComboBox может сбрасывать выбранный элемент SelectedItem при двунаправленной привязке, хотя вроде бы всё сделано верно? Например, есть такая XAML разметка:

<ComboBox SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" ItemsSource="{Binding MyList, Mode=OneWay}" />

Так привязка работать не будет. А вот так будет:

<ComboBox ItemsSource="{Binding MyList, Mode=OneWay}" SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" />

Несмотря на практически идентичную разметку, первый кусок кода работает не так, как ожидается.

Нюанс в том, что парсер XAML-разметки разбирает код последовательно. Если сначала объявлена привязка выделенного элемента SelectedItem, а после – источник данных для ComboBox, то при загрузке окна и построении графического интерфейса GUI всегда будет выбран первый элемент (ComboBox.SelectedIndex=0).

Поэтому следует всегда объявлять сначала источник элементов списка ComboBox.ItemsSource, а потом привязку выделенного элемента ComboBox.SelectedItem. Это касается и других элементов графического интерфейса, источниками которых являются коллекции, списки или массивы.

Читать далее...

Как передать событие родительскому элементу страницы XAML

Published in Полезные советы

Данный пример передаёт событие прокрутки среднего колеса мыши родительскому элементу:

В XAML присвоим имя событию:

<Element PreviewMouseWheel="scrollingTest">

Код (VB.NET):

''' <summary>
''' Обеспечивает прокрутку родительского ScrollViewer с помощью среднего колеса мыши.
''' </summary>
Private Sub scrollingTest(sender As Object, e As MouseWheelEventArgs)
  e.Handled = True 'перехват события
  Dim e2 As MouseWheelEventArgs = New MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta) 'получаем свойства события
  e2.RoutedEvent = UIElement.MouseWheelEvent 
  MainWindow.MyScrollViewer.RaiseEvent(e2) 'передаём перехваченное событие родительскому скролл-вьюеру
End Sub
Читать далее...

Реализация ObservableCollection в WPF

Published in Полезные советы

1. Класс должен реализовывать интерфейс INotifyPropertyChanged:

Public Class MainWindow
    Implements INotifyPropertyChanged

Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

Public Sub NotifyPropertyChanged(ByVal propName As String)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
End Sub

2. Перечислимое свойство должно быть типа System.Collections.ObjectModel.ObservableCollection:

	
Public Property MyCollection As ObservableCollection(Of SingleStep) 
Читать далее...

Перенос текста TextWrapping в XAML

Published in Полезные советы

Зачастую нужно чтобы текст переносился на следующую строку, занимая всю ширину родительского элемента. За это отвечает свойство TextWrapping.Распространённые случаи:

<ListView HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

Элементы ListViewItem при этом должны быть типа TextBlock, а горизонтальная полоса прокрутки HorizontalScrollBar отключена.

Или другой случай:

<GroupBox.Header>
  <TextBlock TextWrapping="Wrap" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type GroupBox}}, Path=ActualWidth}" />
</GroupBox.Header>

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

Читать далее...

Поиск определённого окна в приложении .NET

Published in Полезные советы

Чтобы получить объект Window определённого типа, можно перебрать все активные окна приложения:

For Each wnd As Window In Application.Current.Windows
    If wnd.GetType.Equals(GetType(MyParentWindow)) Then
        parentWindow = CType(wnd, MyParentWindow)
        Exit For
    End If
Next
Читать далее...

Как использовать UserControl в качестве шаблона для ListViewItem

Published in Полезные советы

Чтобы использовать собственный пользовательский элемент управления UserControl в качестве шаблона элемента ListViewItem или ListBoxItem, нужно следующее:

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <local:MyUserControl />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Здесь local – это пространство имён вашей сборки. Например: <xmlns:local="clr-namespace:MyApplication" />>.

При этом в MyUserControl не следует задавать контекст данных DataContext.

Читать далее...

WPF: как растянуть содержимое заголовка экспандера на всю ширину

Published in Полезные советы

Чтобы в WPF растянуть содержимое заголовка экспандера Expander.Header на всю ширину, необходимо указать в свойстве Width с помощью расширения разметки следующее:

<Expander>
    <Expander.Header>
        <Grid 
            Width="{Binding RelativeSource
                     ={RelativeSource Mode=FindAncestor, 
                     AncestorType={x:Type Expander}}, 
                     Path=ActualWidth}">
…
        </Grid>
    </Expander.Header>
</Expander>

При таком подходе, если вы имеете множественные элементы типа Expander на странице или в окне, возможны проблемы производительности при отрисовке пользовательского интерфейса (GUI). В этом случае можно поступить так: переопределить стиль экспандера и задать свойству HorizontalAlignment элемента ContentPresenter значение Stretch вместо Left.

Читать далее...
Subscribe to this RSS feed
  1. Arduino это...
  2. Arduino это...
  3. Arduino это...
Отличный способ начать знакомство с электроникой, микроконтроллерами и программированием!
Замечательное средство для создания собственных электронных устройств, которые пригодятся в быту или для развлечения!
Уникальный конструктор, для которого разработаны десятки совместимых датчиков и модулей!
next
prev