Caliburn.Micro Создать Combobox динамически - PullRequest
1 голос
/ 02 марта 2012

Я новичок в WPF и новичок в Caliburn.Micro. Я пытаюсь создать комбинированный список динамически. По сути, я пытаюсь создать текстовое поле с автозаполнением, но я не могу понять, как динамически создать комбинированный список или присоединиться к комбинированному списку, который уже находится в xaml, чтобы я мог изменить его свойства. 1001 *

Мой XAML выглядит следующим образом:

<StackPanel>
    <TextBox x:Name="customerNameTxt" Width="150" HorizontalAlignment="Stretch" cal:Message.Attach="[Event TextChanged]=[customerNameTxt_TextChanged()]" />
    <ComboBox Height="20" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" 
              ItemsSource="{Binding DropDownSource, Mode=TwoWay}" />
</StackPanel>

Как вы можете видеть, я обязуюсь заполнить поле со списком - у меня это отлично работает, а также меняется, когда пользователь вводит текстовое поле. Я просто хотел бы либо изменить свойства в комбинированном ящике, либо создать его динамически, что затем дало бы мне доступ ко всем нужным мне свойствам. Я использую Caliburn.micro, поэтому мне нужно получить в выпадающем списке файл ShellModelView.cs.

Любая помощь с этим была бы великолепна.

ОБНОВЛЕНИЕ: Благодаря идее попробовать использовать WPFToolkit AutoCompleteBox. Мне удалось заставить это работать довольно легко, и это здорово, за исключением того, что теперь код, который у меня был в моей ViewModel, больше не извлекает значение AutoCompleteBox, используя Caliburn.micro. После небольшой игры я понял это - я не уверен, что это правильный способ сделать это, но это работает для меня. Если это не лучший метод, мне было бы интересно услышать о других способах сделать это.

Вот мой XAML:

<toolkit:AutoCompleteBox x:Name="customerNameTxt" ItemsSource="{Binding DropDownSource}" IsTextCompletionEnabled="True" Grid.Row="0" Grid.Column="2" cal:Message.Attach="[Event SelectionChanged]=[Action customerNameTxt_SelectionChanged($eventargs)]" />

Вот моя ViewModel:

public void customerNameTxt_SelectionChanged(SelectionChangedEventArgs e)
    {
        BindObj obj = e.AddedItems[0] as BindObj;
        if (null != obj)
        {
            customerNameTxt = obj.Text;
        }
    }

Теперь мое свойство customerNameTxt установлено так, как было раньше.

Любые советы по лучшим методам будут великолепны. Как я уже сказал, я новичок в этом материале WPF, поэтому все еще многому учусь.

Спасибо

Mudders

1 Ответ

1 голос
/ 03 марта 2012

У вас есть доступ к представлению из вашей модели представления в Caliburn.Micro. Вы можете либо переопределить OnViewLoaded в вашей модели представления, либо позвонить GetView

protected override void OnViewLoaded(object view)
{
   base.OnViewLoaded(view);
}

Здесь вы можете привести объект представления к вашему типу представления и вызвать FindName("controlName"), чтобы получить ваш экземпляр ComboBox.

Однако, почему вы не используете одну из уже доступных реализаций автозаполнения текстового поля? Например, один из них включен в WPF Toolkit .

...