Как прочитать из пути в wpf comboboxitem и записать в путь привязки - PullRequest
1 голос
/ 21 марта 2010

Я попытался создать пример, чтобы показать мою проблему.

Мой комбинированный список содержит список объектов в качестве источника. В моем примере это список людей. В поле со списком я хочу показать имя и фамилию человека. Но я хочу сохранить фамилию человека в свойстве "владелец" дома-объекта.

Я предположил, что я связал SelectedValue со своим свойством, а SelectedValuePath - с именем свойства в комбинированном элементе.

Я уже гуглил и пробовал просматривать другие версии, но ничего не получалось.

Если я использую SelectedItem вместо SelectedValue с той же привязкой, то по крайней мере значение функции get tostring записывается в свойстве. К сожалению, это решение не вписывается в остальную часть моей программы, потому что я не хочу переопределять «ToString».

Xaml:

<Window x:Class="MultiColumnCombobox.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
x:Name="window">

<Grid>
    <ComboBox Height="23"
              Margin="72,12,86,0"
              Name="ComboBox1"
              VerticalAlignment="Top"                  
              SelectedValue="{Binding CurrentHouse.Owner, ElementName=window, Mode=TwoWay}"
              SelectedValuePath="LastName"
              ItemsSource="{Binding PersonList, ElementName=window, Mode=Default}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <WrapPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=FirstName}"
                               Padding="10,0,0,0" />
                    <TextBlock Text="{Binding Path=LastName}"
                               Padding="10,0,0,0" />
                </WrapPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    <Button Height="23"
            Click="PrintButton_Click"
            HorizontalAlignment="Left"
            Margin="12,0,0,9"
            Name="PrintButton"
            VerticalAlignment="Bottom"
            Width="75">Print</Button>

</Grid>

C #

using System.Collections.Generic;
using System.Windows;
using System;

namespace MultiColumnCombobox
{  
public partial class Window1 : Window
{
    private List<Person> _PersonList = new List<Person>();        
    public List<Person> PersonList
    {
        get { return _PersonList; }
        set { _PersonList = value; }
    }

    private House _CurrentHouse = new House { Owner = "Green", Number = "11" };
    public House CurrentHouse
    {
        get { return _CurrentHouse; }

    }

    public Window1()
    {                        
        InitializeComponent();
        PersonList.Add(new Person {FirstName = "Peter", LastName = "Smith"});
        PersonList.Add(new Person {FirstName = "John", LastName = "Meyer"});
        PersonList.Add(new Person {FirstName = "Fritz", LastName = "Green"});            
    }

    private void PrintButton_Click(object sender, RoutedEventArgs e)
    {            
        MessageBox.Show(CurrentHouse.Owner + ":" + CurrentHouse.Number);
    }       
}

public class House
{ 
    public string Owner  { get; set; }
    public string Number  { get; set; }
}

public class Person 
{ 
    public string FirstName  { get; set; }
    public string LastName  { get; set; }
}
}

Может быть, у кого-то есть идея,

Christian

1 Ответ

0 голосов
/ 21 марта 2010

Если я понимаю ваш вопрос, вы хотите взять фамилию выбранного в данный момент персонажа в поле со списком и установить его значение в свойстве CurrentHouse.Owner.Если это так, просмотрите следующее и посмотрите, имеет ли это смысл.В частности, обратите внимание на настройку атрибутов SelectedValue и SelectedValuePath ComboBox.

Код позади

public partial class MultiColumnCombobox : Window
{
    public List<Person> PersonList { get; set; }

    public House CurrentHouse { get; set; }

    public MultiColumnCombobox()
    {
        InitializeComponent();

        PersonList = new List<Person>
                         {
                             new Person
                                 {
                                     FirstName = "Peter",
                                     LastName = "Smith"
                                 },
                             new Person
                                 {
                                     FirstName = "John",
                                     LastName = "Meyer"
                                 },
                             new Person
                                 {
                                     FirstName = "Fritz",
                                     LastName = "Green"
                                 }
                         };

        CurrentHouse = new House
                           {
                               Owner = "Green",
                               Number = "11"
                           };

        this.DataContext = this;

        ShowCurrentHouseInfo();
    }

    private void OnComboBoxChanged( object sender, SelectionChangedEventArgs e )
    {
        ShowCurrentHouseInfo();
    }

    private void ShowCurrentHouseInfo()
    {
        MyTextBlock.Text = string.Format(
            "CurrentHouse.Owner: {0} : CurrentHouse.Number: {1}",
            CurrentHouse.Owner, CurrentHouse.Number);
    }
}

public class House
{
    public string Owner { get; set; }
    public string Number { get; set; }
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

XAML

<StackPanel>
    <ComboBox
        Margin="10"
        Name="ComboBox1"
        VerticalAlignment="Top"        
        SelectedValue="{Binding CurrentHouse.Owner}"
        SelectedValuePath="LastName"
        SelectionChanged="OnComboBoxChanged"
        ItemsSource="{Binding PersonList}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <WrapPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=FirstName}"
                           Padding="10,0,0,0" />
                    <TextBlock Text="{Binding Path=LastName}"
                           Padding="10,0,0,0" />
                </WrapPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

    <TextBlock x:Name="MyTextBlock" Margin="10" />

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