как позволить 2 combox взаимодействовать друг с другом RSS - PullRequest
0 голосов
/ 01 апреля 2012

Я вложил свой код в XAML и C #, но он не работает.Пожалуйста, порекомендуйте.Спасибо

enter code here

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="4*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="0.7*"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="0.7*"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="5*"></RowDefinition>
    </Grid.RowDefinitions>
    <TextBlock  Text="Select Country" Grid.Row="0" Grid.Column="0"></TextBlock>
    <ComboBox x:Name="CmbxCountry" SelectionChanged="CmbxCountry_SelectionChanged" Grid.Row="0" Grid.Column="1"></ComboBox>
    <TextBlock Text="Select State" Grid.Row="2" Grid.Column="0"></TextBlock>
    <ComboBox x:Name="CmbxState" Grid.Row="2" Grid.Column="1"></ComboBox>
</Grid>

Пространство имен Survey_Model {открытый частичный класс MainPage: UserControl {// private Brush _selectedBrush = new SolidColorBrush (Color.FromArgb (255,255, 0, 0));// private Brush _normalBrush = new SolidColorBrush (Color.FromArgb (255, 0, 0, 0));

    public MainPage()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    }


    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        List<Country> list = new List<Country>
        {
           new Country{ Name = "USA" },
           new Country{ Name = "China"},
           new Country{States = GetStates()}
        };

        CmbxCountry.ItemsSource = list;
        CmbxCountry.DisplayMemberPath = "Name";
       }

    private List<State> GetStates()
    {
        List<State> list = new List<State> 
        { 
          new State{ Name = "NJ" },
           new State{ Name = "NY" },
            new State{ Name = "NV" },
             new State{ Name = "CT" },
             new State{ Name = "CA" }

        };
        return list;

    }
    private void CmbxCountry_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var cmbx = sender as ComboBox;
        var selectedItem = cmbx.SelectedItem as Country;

        CmbxState.ItemsSource = selectedItem.States;
        CmbxState.DisplayMemberPath = "Name";
    }

}

public class Country
{
    public string Name { get; set; }
    public List<State> States { get; set; }
}

public class State
{
    public string Name { get; set; }

}

}

1 Ответ

0 голосов
/ 01 апреля 2012

У меня работает. Хотя я полагаю, что вы устанавливаете неправильный элемент в первом комбинированном списке. В настоящее время ваш список "Страна" заполнен следующими странами: "США", "Китай", "". Всякий раз, когда вы выбираете третий (""), вы получите непустой список состояний.

Если вы хотите, чтобы в вашей текущей реализации были государства для каждой страны, я бы предложил следующее:

List<Country> list = new List<Country>
    {
       new Country{ Name = "USA", States = GetStates() },
       new Country{ Name = "China", States = new List<State>() },
    };

А также, я бы рекомендовал преобразовать это в MVVM с привязкой, имеющей модель, которая содержит выбранную страну и обновляющую второе значение комбинированного списка соответственно:

public class MainViewModel : INotifyPropertyChanged
{
    private Country _selectedCountry;

    public ObservableCollection<Country> Countries { get; }
    public Country SelectedCountry 
    { 
        get { return _selectedCountry; }
        set { _selectedCountry = value; RaisePropertyChanged("SelectedCountry"); RaisePropertyChanged("States"); }
    }

    public State[] States
    {
       get 
       {
           if (_selectedCountry == null) 
               return new State[0]; 
          return _selectedCountry.States.ToArray();
       }
    }
}

И вашему представлению (xaml) не нужно будет определять события и использовать только привязку.

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