ComboBox wpf не элемент не выбран - PullRequest
0 голосов
/ 21 марта 2010

Я пытаюсь привязать поле со списком к списку объектов, и оно прекрасно работает, кроме выбранного значения, я пропускаю somethign?

<ComboBox ItemsSource="{Binding OrderInfoVm.AllCountries}"
          SelectedValuePath="country_code" DisplayMemberPath="country_name" 
          SelectedValue="{Binding OrderInfoVm.BillingCountry}" />

В основном я хочу привязать значение к кодам страны и установить выбранное значение для кода страны, привязанного к OrderInfoVm.BillingCountry (который реализует INotifyPropertyChanged)

Изначально, когда элемент управления загружает выбранное значение пусто, но при нажатии заполняется BillingCountry. Выбранное значение, похоже, не меняется. Как я могу исправить это?

Ответы [ 5 ]

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

Я согласен с Алексом, что использование SelectedItem дает желаемое поведение. Смотрите код ниже. Это работает и, надеюсь, поможет вам в дальнейшем:

    <Window x:Class="SelectedValueSpike.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">
    <StackPanel>
        <ComboBox ItemsSource="{Binding OrderInfoVm.AllCountries}" 
          SelectedValuePath="country_code" DisplayMemberPath="country_name"  
          SelectedItem="{Binding OrderInfoVm.BillingCountry}"
          IsSynchronizedWithCurrentItem="True"
          Name="AllCountriesBox"/>
        <TextBox Text="{Binding ElementName=AllCountriesBox, Path=SelectedValue}"/>
        <Button>
            Change the textbox to "Ca","NL",or "US" and click!
        </Button>
    </StackPanel>
</Window>

    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Windows;

    namespace SelectedValueSpike
    {
        public partial class Window1 : Window
        {
            public OrderInfoVm OrderInfoVm{ get; set;}
            public Window1()
            {
                InitializeComponent();
                OrderInfoVm=new OrderInfoVm();
                OrderInfoVm.AllCountries.Add(new Country("US","US of A"));
                OrderInfoVm.AllCountries.Add(new Country("NL","Netherlands"));
                OrderInfoVm.AllCountries.Add(new Country("Ca","Canada"));
                OrderInfoVm.BillingCountry = OrderInfoVm.AllCountries[1];
                DataContext = this;
            }
        }



public class OrderInfoVm:INotifyPropertyChanged
    {
        public OrderInfoVm()
        {
            AllCountries=new ObservableCollection<Country>();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private ObservableCollection<Country> _allCountries;
        public ObservableCollection<Country> AllCountries
        {
            get { return _allCountries; }
            set
            {
                _allCountries = value;
                OnPropertyChanged("AllCountries");
            }
        }

        private Country _billingCountry;
        public Country BillingCountry
        {
            get { return _billingCountry; }
            set
            {
                _billingCountry = value;
                OnPropertyChanged("BillingCountry");
            }
        }

        private void OnPropertyChanged(string property)
        {
            if(PropertyChanged!=null)
                PropertyChanged(this,new PropertyChangedEventArgs(property));
        }
    }

    public class Country
    {
        public string country_code { get; set; }
        public string country_name { get; set; }

        public Country(string code, string name)
        {
            country_code = code;
            country_name = name;
        }
    }
}
1 голос
/ 21 марта 2010

Возможно, вы пытаетесь реализовать что-то похожее на это: Связанный ComboBox

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

Пожалуйста, убедитесь, что вы указали правильный путь привязки. Попробуйте запустить проект в режиме отладки и посмотрите в окне вывода, чтобы увидеть, есть ли какие-либо ошибки привязки

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

Дайте этому шанс; Я полагаю, что у вас смешаны SelectedValuePath и SelectedValue:

<ComboBox ItemsSource="{Binding OrderInfoVm.AllCountries}"
   SelectedValue="country_code" 
   DisplayMemberPath="country_name" 
   SelectedValuePath="{Binding OrderInfoVm.BillingCountry}" />

Для справки:

ItemsSource = Получает или задает коллекцию, используемую для генерации содержимого ItemsControl (ComboBox).

SelectedValue = Получает или задает значение SelectedItem, полученное с помощью SelectedValuePath.

SelectedValuePath = Получает или задает значение, указывающее путь, используемый для получения SelectedValue из SelectedItem.

DisplayMemberPath = Получает или задает путь к значению исходного объекта, который служит визуальным представлением объекта.

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

Попробуйте изменить его на SelectedItem и установить Mode = TwoWay ...

<ComboBox ItemsSource="{Binding OrderInfoVm.AllCountries}"
          SelectedValuePath="country_code" DisplayMemberPath="country_name" 
          SelectedItem="{Binding OrderInfoVm.BillingCountry, Mode=TwoWay}" />

Редактировать: Вам может не потребоваться изменить его на SelectedItem, возможно, просто будет работать настройка TwoWay, но именно так я и сделал в своем собственном коде.

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