Укажите, какое поле отображается в части текстового поля WPF ComboBox с привязкой к данным. - PullRequest
0 голосов
/ 06 февраля 2009

У меня есть ComboBox в WPF, который привязан к данным и имеет шаблон данных, который управляет отображением каждого из элементов. Я сделал так, чтобы каждый элемент отображался с двумя битами текста (для свойств Name и Path) и одним изображением (для свойства Icon).

В тот момент, когда я выбираю элемент из ComboBox, бит текстового поля ComboBox просто меняется на «TestWPF.Result», который является именем класса, которым я заполнил ComboBox.

Меня интересует одна (или обе) две вещи:

  1. Как мне изменить его, чтобы оно отображало значение одного из полей (например, чтобы оно отображало значение поля Имя, а не имя класса)?

  2. Можно ли заставить его использовать тот же DataTemplate, что и в списке элементов, чтобы после выбора элемента он отображался в закрытом ComboBox так же, как он выглядит в списке элементов. По сути, у меня есть DataTemplate с именем ShowResults и ComboBox, который использует этот шаблон. Я также добавил в отдельный ContentControl, который должен показать детали выбранного элемента в ComboBox, но я хочу получить его, чтобы заменить текстовое поле в ComboBox.

Обновление:

Спасибо за первый ответ. Я попытался использовать отдельный ContentControl, как вы описали, и он работает нормально. Теперь вопрос заключается в том, как заменить часть текстового поля ComboBox на этот ContentControl. Любые намеки на это будут приветствоваться.

Кроме того, можно ли заменить бит текстового поля элемента управления ComboBox смесью ContentControl и текстового поля, чтобы я все еще мог вводить текстовое поле, чтобы помочь выбрать элементы из ComboBox, но затем, когда я закрываю выпадающий остаток бит ContentControl будет заполнен остальным текстом и значком. Надеюсь, что это имеет смысл - задавайте вопросы, если это не так!

Код:

Меня попросили опубликовать мой код - вот оно. Я пытался удалить вещи, которые, как я знаю, определенно не имеют отношения к делу, но я точно не знаю, что относится к делу, поэтому, если сомневаюсь, я оставил их в теме.

<Window x:Class="TestWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:TestWPF"
Title="Window1" Height="300" Width="843" Loaded="Window_Loaded">
<Window.Resources>
    <DataTemplate x:Key="ShowResult" DataType="TestWPF.Result">
        <StackPanel Margin="5" Orientation="Horizontal">
            <Image Width="32" Height="32"  Source="{Binding Path=Image}"/>
            <StackPanel Margin="5">
                <TextBlock FontWeight="Bold" Text="{Binding Path=Name}"/>                    
                <TextBlock Text="{Binding Path=Path}"/>
            </StackPanel>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<Grid Width="786">
    <Button Height="23" HorizontalAlignment="Right" Margin="0,24,166,0" Name="btnTest" VerticalAlignment="Top" Width="75" Click="btnTest_Click">Add</Button>
    <ComboBox StaysOpenOnEdit="True"  DropDownClosed="comboBox1_DropDownClosed" PreviewTextInput="comboBox1_PreviewTextInput" SelectionChanged="comboBox1_SelectionChanged" ItemTemplate="{StaticResource ShowResult}"  Margin="259,109,22,89" Name="comboBox1" IsEditable="True" />
    <ContentControl Height="50" Margin="268,0,22,21" Name="contentControl1" VerticalAlignment="Bottom" Content="{Binding ElementName=comboBox1,Path=SelectedValue}" ContentTemplate="{StaticResource ShowResult}"/>
</Grid>

Ответы [ 2 ]

1 голос
/ 07 февраля 2009

Вы получили правильную часть связывания - привязку к данным и использование DataTemplate для отображения источника так, как вы хотите.

Что касается вашего второго вопроса, способ сделать это - использовать ComboBox с IsEditable = "True", как у вас, и с помощью обработчика события TextChanged проверить, содержит ли comboBox.Items новое значение, если нет используйте Linq для поиска совпадения:

if (comboBox.Items.Contains(e.NewValue))
    return;
var matches = with comboBox.Items select item where item.BeginsWith(e.NewValue);
if (matches.Count > 0) comboBox.SelectedItem = matches.First();
0 голосов
/ 06 февраля 2009

Просто поместите выражение привязки свойства в textBox. Вам не нужно применять шаблон.

Еще один способ получить точный шаблон данных, поместить ContentControl вместо textBox и назначить тот же DataTemplate (скажем, x: Name = "robinTemplate")

<ContentControl Content="{Binding ElementName=cmbBox,Path=SelectedValue}" ContentTemplate="{StaticResource robinTemplate}"/>

Для отображения выбранного контента таким же образом: Создайте копию шаблона элемента управления Combobox, и вы найдете там ContentPresenter. Замените это ContentControl .. Это не правильное решение, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...