2010-03-21 2 views
1

내 문제를 보여주기 위해 예제를 만들려고했습니다.wpf comboboxitem 경로에서 읽는 방법 및 바인딩 경로에 쓰기

내 콤보 박스에는 개체 목록이 itemssource로 있습니다. 나의 예에서는 Person 목록입니다. 콤보 박스에서 저는 그 사람의 이름과 성을 보여주고 싶습니다. 하지만 집 개체의 "소유자"속성에있는 사람의 성을 저장하고 싶습니다.

내 생각 엔 SelectedValue를 내 속성에 연결하고 SelectedValuePath를 comboboxitem의 속성 이름에 바인딩했다는 것입니다.

나는 이미 Google 검색을 시도했지만 다른 버전의보기를 시도했지만 아무 것도 효과가 없었습니다.

동일한 바인딩이있는 SelectedValue 대신 SelectedItem을 사용하는 경우 최소한 "tostring"함수 get의 값이 속성에 기록됩니다. 슬프게도 그 해결책은 "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; } 
} 
} 

어쩌면 누군가가

답변

0

나는 당신의 질문을 이해한다면,

기독교 아이디어, ComboBox에서 현재 선택된 Person의 성을 가져와 CurrentHouse.Owner 속성에 값을 설정하려고합니다. 그렇다면 다음을 검토하여 의미가 있는지 확인하십시오. 구체적으로 ComboBox의 SelectedValueSelectedValuePath 특성 설정을 살펴보십시오.

코드

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> 
뒤에