Рейтинг@Mail.ru

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

Опубликовано в Полезные советы

Почему 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

Опубликовано в Полезные советы

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

В 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

Опубликовано в Полезные советы

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

Опубликовано в Полезные советы

Зачастую нужно чтобы текст переносился на следующую строку, занимая всю ширину родительского элемента. За это отвечает свойство 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

Опубликовано в Полезные советы

Чтобы получить объект 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

Опубликовано в Полезные советы

Чтобы использовать собственный пользовательский элемент управления 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: как растянуть содержимое заголовка экспандера на всю ширину

Опубликовано в Полезные советы

Чтобы в 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.

Подробнее ...
Подписаться на этот канал RSS