2016-02-10 11 views
0

Прежде всего, я попытался много искать, но, если мне кажется, что Google-фу не хватает, не стесняйтесь мгновенно связывать меня с другой статьей/вопросом, на который вы ответите.Как выбрать свойство из SelectedItem на ComboBox?

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

public class MappedValue 
{ 
    public string Representation 
    { 
     get; 
     set; 
    } 
    public object Value 
    { 
     get; 
     set; 
    } 
} 

public class ParameterValue 
{ 
    public object Value 
    { 
     get; 
     set; 
    } 
} 

<ComboBox ItemsSource="{Binding Path=MappedValues}" 
    DisplayMemberPath="Representation" 
    SelectedItem="{Binding Path=ParameterValue.Value}" 
    SelectedValue="{Binding Path=ParameterValue}" 
    SelectedValuePath="Value"/> 

«MappedValues» - это всего лишь коллекция.

То, что я пытаюсь сделать, это вытащить свойство «Значение» из выбранного MappedValue и сохранить его в «ParameterValue.Value».

Таким образом, он принимает весь выбранный объект MappedValue (в отличие от свойства MappedValue.Value) и устанавливает его как «ParameterValue.Value».

Я не понимаю функцию этих свойств combobox, или нет простого способа сделать это с помощью XAML и ComboBox?

+0

Старейший; Вы пробовали свойство Text? Он работает для меня. Http: //stackoverflow.com/questions/450059/how-do-set-the-selected-item-in-a-combobox-to-match-my-string-using-c – Ggalla1779

+0

I не думайте, что свойство Text сработало бы, потому что в моем использовании мне нужен был объект (примитивный или экземпляр класса), который был сопоставлен в том же объекте, где текст (который был отображен в поле со списком). – NaimK

ответ

1

В моем примере я использовал ObservableCollection для хранения списка класса Person. Если вы реализуете измененный интерфейс свойства, вы можете просто установить выбранный элемент в свойства в коде позади. Таким образом, у вас будет полный доступ к свойствам объектов в вашем списке. Я надеюсь, что это помогает

Xaml

<ComboBox x:Name="comboBox" 
       HorizontalAlignment="Left" 
       Margin="130,83,0,0" 
       VerticalAlignment="Top" 
       Width="120" 
       ItemsSource="{Binding collection}" 
       DisplayMemberPath="firstName" 
       SelectedItem="{Binding SelectedPerson}" 
       SelectionChanged="comboBox_SelectionChanged"/> 
    <Button x:Name="btnCheck" Content="Button" HorizontalAlignment="Left" Margin="156,129,0,0" VerticalAlignment="Top" Width="75" Click="btnCheck_Click"/> 

C# Код

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private ObservableCollection<Person> collection = new ObservableCollection<Person>(); 

    public ObservableCollection<Person> Collection 
    { 
     get { return collection; } 
     set { collection = value; OnPropertyChanged(); } 
    } 

    private Person selectedPerson = new Person(); 

    public Person SelectedPerson 
    { 
     get { return selectedPerson; } 
     set { selectedPerson = value; OnPropertyChanged(); } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     collection = new ObservableCollection<Person>() { { new Person("Murray", "Hart")}, { new Person("John", "Clifford") } }; 
     comboBox.ItemsSource = collection; 
    } 

    private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     SelectedPerson = (Person)comboBox.SelectedItem; 
    } 

    protected void OnPropertyChanged([CallerMemberName] string name = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    private void btnCheck_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(SelectedPerson.lastName); 
    } 
} 

public class Person 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 

    public Person() 
    { 

    } 

    public Person(string fname, string lname) 
    { 
     firstName = fname; 
     lastName = lname; 
    } 
} 
+0

Ву, я человек! –

+0

Так что я в значительной степени закончил это. Я все еще чувствую, что должен быть лучший способ сделать это, просто в xaml, но способ, которым мой код и xaml шел, просто облегчил это сделать, и фактически позволил мне сделать дополнительную проверку, необходимо сделать. – NaimK

+0

Рад, что я мог вам помочь. –

Смежные вопросы