Могу ли я отключить первый элемент в поле со списком WPF в коде xaml? - PullRequest
2 голосов
/ 26 апреля 2019

Рассмотрим следующий комбинированный список:

<ComboBox ItemsSource="{Binding Presets.VolumePresetList}" SelectedIndex="{Binding VolumePresetSelectedIndex, UpdateSourceTrigger=PropertyChanged}" Margin="10, 10" HorizontalAlignment="Left"
            MinWidth="150">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding PresetName, UpdateSourceTrigger=Explicit}" VerticalAlignment="Center" Height="20" BorderThickness="0" LostFocus="TextBox_LostFocus" KeyUp="TextBox_KeyUp"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

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

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

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вы можете использовать тот факт, что PreviousData RelativeSource вернет null для первого элемента коллекции. Зная, что вы можете добавить DataTrigger к вашему DataTemplate, чтобы установить для свойства IsEnabled TextBox значение false.

Вот упрощенная версия ItemTemplate с привязкой PreviousData:

       <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBox x:Name="TextBox" />
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=PreviousData}}"
                                 Value="{x:Null}">
                        <Setter TargetName="TextBox" Property="IsEnabled" Value="False" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ComboBox.ItemTemplate>
1 голос
/ 26 апреля 2019

Я создал составную коллекцию с DataBinding для ListView, но логика будет такой же:

<ListView SelectedValue="{Binding youVMPropertyHere}">
    <ListView.ItemsSource>
        <CompositeCollection>
            <ListViewItem IsHitTestVisible="False">Default Item</ListViewItem>
            <CollectionContainer Collection="{Binding Source={StaticResource cvsPresetLists}}"/>
        </CompositeCollection>
    </ListView.ItemsSource>
<!-- Where-->
<Window.Resources>
    <CollectionViewSource Source="{Binding Presets.VolumePresetList}" x:Key="cvsPresetLists"/>
</Window.Resources>  

Таким образом, вы можете иметь первый элемент, который нельзя выбрать.Я бы также использовал SelectedValue вместо SelectedIndex.

...