WPF - Как загрузить текст в текстовый блок в несколько элементов управления при нажатии - PullRequest
0 голосов
/ 20 октября 2010

У меня есть это требование, где: Например, у текстового блока есть имя, отображаемое как «Фамилия, Имя», которое при щелчке будет загружать два элемента управления текстовым полем со значением «Имя», загруженным в его собственное поле, и значением «Фамилия» в собственное поле, и держать их готовыми для редактирования. Несмотря на то, что я могу легко написать несколько условий if в своем коде для достижения этой цели, я ищу более эффективные способы избежать такого решения, поскольку к нему нет обработки WPFism или MVVM. Кроме того, на моем экране есть куча других элементов управления, которые будут нуждаться в таком поведении, и код может вскоре стать безобразным, если я прибегну к первоначальному способу его решения, просто переключив видимость. Есть ли лучший способ решить эту проблему в WPF? Смогу ли я сгруппировать эти элементы управления в пользовательский элемент управления и определить свой шаблон элемента управления (но это будет означать, что мне нужно будет свернуть такие элементы для всех элементов управления на моем экране.)

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

Спасибо Bala

1 Ответ

0 голосов
/ 21 октября 2010

Звучит так, будто ты хочешь попасть в чудесный мир DataTemplates

сначала мы создадим класс контейнера для ваших данных

public class Person
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public Person(string first, string last)
    {
        FirstName = first;
        LastName = first;
    }
}

Затем в коде вашего элемента хостинга (возможно, окна). Вы можете объявить и ObservableCollection<> об объектах.

//populate me wherever!
public ObservableCollection<Person> People {get;set;}

(не забывайте инициализировать это где-нибудь, чтобы избежать всевозможных ненужных исключений)

Затем вы можете связать коллекцию с коллекцией предметов, мне нравится ItemsControl

<ItemsControl ItemsSource="{Binding Path=People}"/>

За исключением того, что это не дает желаемого результата. Поэтому, хотя мы можем переопределить ToString() нашего класса, чтобы выплевывать некоторые отформатированные данные, мы можем сделать это лучше, переопределив шаблон элемента элемента управления items.

<ItemsControl ItemsSource="{Binding Path=People}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button DataContext="{Binding}" Click="Button_Click">
                    <Button.Content>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat="{}{1}, {0}">
                                    <Binding Path="FirstName"/>
                                    <Binding Path="LastName"/>
                                 </MultiBinding>
                             </TextBlock.Text>
                        </TextBlock>
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Обратите внимание, что для правильного форматирования текста на кнопках я использую мультисвязывание со средством форматирования строки.

Теперь с помощью кнопок Click Обработчик событий вы можете обработать элемент. Поскольку Sender события будет кнопкой, а DataContext кнопки будет лицом объекта, который он представляет, вы можете делать то, что хотите.

Вы также можете найти свойство ListBox и его SelectedItem очень полезным в вашем конкретном случае.

Надеюсь, этого достаточно, чтобы начать, -Val

...