Условные поля со списком не работают должным образом - PullRequest
3 голосов
/ 10 мая 2019

Я разрабатываю приложение uwp, написанное на C #.Мое приложение использует prism.windows.

Приложение имеет два поля со списком.Первый - это выбор стран.Следующий показывает города страны, которая выбрана в первом поле со списком.

Я выбираю Японию в первом поле со списком, Токио отображается в следующем поле со списком.Затем я выбираю Соединенные Штаты. Токио по-прежнему отображается в следующем.

Чикаго и Дейтон должны отображаться в следующем.

namespace TestComboBox2.ViewModels
{
    public class MainPageViewModel:BindableBase
    {
        public Views.MainPage View { get; private set; } = null;

        public void Initialize(Views.MainPage mainPage)
        {
            View = mainPage;
        }
        public MainPageViewModel()
        {
            ChangeGroupId();
        }
        private List<CbGroup> CbGroupList = new List<CbGroup>();
        public List<CbGroup> CbGroupLists
        {
            get { return CbGroupList; }
            set { this.SetProperty(ref this.CbGroupList, value); }
        }
        private List<CbItem> CbItemList = new List<CbItem>();
        public List<CbItem> CbItemLists
        {
            get { return CbItemList; }
            set { this.SetProperty(ref this.CbItemList, value); }
        }

        private string txGroupId;
        public string TxGroupId
        {
            get { return txGroupId; }
            set
            {
                this.SetProperty(ref this.txGroupId, value);
                ChangeItemId(txGroupId);
            }
        }
        private string txItemId;
        public string TxItemId
        {
            get { return txItemId; }
            set { this.SetProperty(ref this.txItemId, value); }
        }
        private void ChangeGroupId()
        {
            CbGroupList.Add(new CbGroup("A", "Japan"));
            CbGroupList.Add(new CbGroup("B", "United States"));
            CbGroupList.Add(new CbGroup("C", "CANADA"));
        }
        private void ChangeItemId(string ValueId)
        {
            try
            {
                if (CbItemLists != null)
                {
                    CbItemList.Clear();
                }
                TxItemId = null;
                //
                switch (ValueId)
                {
                    case "A":
                        CbItemList.Add(new CbItem("A1", "Tokyo"));
                        break;
                    case "B":
                        CbItemList.Add(new CbItem("B1", "Chicago"));
                        CbItemList.Add(new CbItem("B2", "Dayton"));
                        break;
                    case "C":
                        CbItemList.Add(new CbItem("C1", "Toronto"));
                        CbItemList.Add(new CbItem("C2", "Halifax"));
                        CbItemList.Add(new CbItem("C3", "Edmonton"));
                        break;
                }
            }catch(Exception ex)
            {
                string stErrMessage = ex.Message;
            }
        }
    }
    public class CbGroup
    {
        public string GroupId { get; set; }
        public string GroupName { get; set; }
        public CbGroup(string ValueId, string ValueName)
        {
            GroupId = ValueId;
            GroupName = ValueName;
        }
    }
    public class CbItem
    {
        public string ItemId { get; set; }
        public string ItemName { get; set; }
        public CbItem(string ValueId, string ValueName)
        {
            ItemId = ValueId;
            ItemName = ValueName;
        }
    }
}
<Page
    x:Class="TestComboBox2.Views.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestComboBox2"
    xmlns:views="using:TestComboBox2.Views"
    xmlns:viewmodels="using:TestComboBox2.ViewModels"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Page.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Style.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Page.Resources>
    <Grid>
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <TextBlock Style="{StaticResource TextBlckFontSize}"
                       Text="Country"
                           Foreground="Black"
                       />
                <ComboBox Style="{StaticResource ComboBoxStype}"
                      ItemsSource="{Binding CbGroupLists,Mode=OneWay}"
                      SelectedValue="{Binding TxGroupId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                      SelectedValuePath="GroupId"
                      >
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock>
                            <Run Text="{Binding GroupName,Mode=OneWay}"/>
                            </TextBlock>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <TextBlock Style="{StaticResource TextBlckFontSize}"
                           Foreground="Black"
                       Text="City"
                       />
                <ComboBox Style="{StaticResource ComboBoxStype}"
                      ItemsSource="{Binding CbItemLists,Mode=OneWay}"
                      SelectedValue="{Binding TxItemId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                      SelectedValuePath="ItemId"
                      >
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock>
                            <Run Text="{Binding ItemName,Mode=OneWay}"/>
                            </TextBlock>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>

            </StackPanel>
        </StackPanel>
    </Grid>
</Page>

Во втором поле со списком отображаетсягород страны, выбранной в первом поле со списком.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Ну, вы должны использовать ObservableCollection вместо List, потому что ObservableCollection - это коллекция типов, которая предоставляет уведомления, когда элементы добавляются или удаляются. Класс ObservableCollection имеет собственную реализацию INotifyPropertyChanged. Поэтому, когда эта коллекция имеет некоторые изменения, она отражает или уведомляет пользовательский интерфейс. Так что внесите некоторые изменения, вы код

private ObservableCollection<CbItem> CbItemList 
public ObservableCollection<CbItem> CbItemLists
{
    get { return CbItemList ?? (CbItemList = new ObservableCollection<CbItem>()); }
    set { this.SetProperty(ref this.CbItemList, value); }
}
0 голосов
/ 10 мая 2019

Условные поля со списком не работают должным образом

Пожалуйста, измените тип CbItemList на ObservableCollection, который представляет собой динамический сбор данных, который предоставляет уведомления, когда элементы добавляются, удаляются или когда обновляется весь список. Это будет работать.

private ObservableCollection<CbItem> CbItemList = new ObservableCollection<CbItem>();
public ObservableCollection<CbItem> CbItemLists
{
    get { return CbItemList; }
    set { this.SetProperty(ref this.CbItemList, value); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...