TheBigBearNow Ответов: 1

Попытка интерфейса inotifychange и связывания combobox с классом и статическим классом


Привет, я попытался сделать то, что вы сказали, сделав комментарий и посмотрев на Microsoft. Я создал класс State с 3 свойствами (имя, аббревиатуры и список "состояние"), используя INotifyChange в свойствах. Затем я сделал статический класс со списком состояний и в конструкторе добавил все 50 состояний в список и метод для возврата списка в массив. Я не знаю, что еще мне нужно сделать, чтобы привязать свой список к combobox, я чувствую, что я очень близок.
public class US_State : INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                NotifyPropertyChanged();
            }
        }
        private string _abbreviations;
        public string Abbreviations
        {
            get => _abbreviations;
            set
            {
                _abbreviations = value;
                NotifyPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            //if(PropertyChanged!=null)PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        private List<US_State> _allusstates;
        public List<US_State> AllUSStates
        {
            get => _allusstates;
            set
            {
                _allusstates = value;
                NotifyPropertyChanged();
            }
        }

        public US_State()
        {
            Name = null;
            Abbreviations = null;
        }
        public US_State(string ab, string name)
        {
            Name = name;
            Abbreviations = ab;
        }
        public override string ToString()
        {
            return String.Format("{0} - {1}", Abbreviations, Name);
        }
    }
    //Static class of all 50 US_state's
    public static class StatesArray
    {
        public static List<US_State> states;
        
        static StatesArray()
        {
            states = new List<US_State>(50);
            states.Add(new US_State("AL", "Alabama"));
            states.Add(new US_State("AK", "Alaska"));
//and the rest of the 50 states added just like this way above.        }
        public static US_State[] AllFiftyStates()
        {
            return states.ToArray();
        }
    }
Code in WPF Window
    public partial class ProfileScreen : Window
    {
private List<US_State> Get_States = StatesArray.states;
xaml code
<ComboBox x:Name="ComboboxState" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" Width="120" HorizontalAlignment="Left" ToolTip="Enter your state."
                          ItemsSource="{Binding Get_States, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, UpdateSourceTrigger=PropertyChanged}"
                          DisplayMemberPath="Name" SelectedValuePath="Abbreviation"/>


Что я уже пробовал:

загрузка таблицы данных, но вместо этого вы хотите использовать этот интерфейс

Graeme_Grant

Что говорит вам отладочный вывод?

M.Kamran Asim

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

Graeme_Grant

public List<US_State> AllUSStates {...} ..- это не проблема... ItemsSource="{Binding Get_States... должно быть ItemsSource="{Binding AllUSStates... .. на выходе отладчика есть ответ, вот почему я спросил...

M.Kamran Asim

Собственность AllUSStates находится не в том месте. Почему вы используете класс US_State для многоцелевого использования. US_State действует только как модель, которая является сигнатурой того, как вы храните данные.
в то время как AllUSStates содержит данные о состояниях. Это свойство должно быть частью ViewModel, но в вашем случае оно должно быть частью windows.cs.

Чтобы переместить данный объект на файл MainWindow, и сохранить US_State просто. Этот класс будет содержать только атрибуты (общедоступные свойства).

1 Ответов

Рейтинг:
6

M.Kamran Asim

Привет
1. Ваш класс Us_State в порядке. Не нашел никаких проблем. Почему вы создали публичное свойство AllUSStates в классе Us_State. это не требуется.
2. Ваш статический класс StatesArray в порядке, но метод AllFiftyStates не требуется, вы можете объявить состояния как публичное свойство с помощью public getter и private setter. Так что на конструкторе просто заполните состояние свойства, в то время как публично вы можете получить к нему доступ. Кроме того, вы добавляете дополнительные затраты, преобразуя список<us_states> В массив us_states.
Примечание: это предложение.

3. Теперь, наконец, как только вы закончите, создайте общедоступное свойство в вашем mainWindow.xaml.cs. и реализуйте INoityPropertyChanged.

private List<US_State> get_States;
public List<US_States> Get_States{
get=>get_States;
set{
      get_States = value;
      RaisePropertyChange();
   }
}


4. Теперь в окне загрузки события заполните Get_States из источника, например Get_States= StatesArray.states;

5. Наконец, найти Get_States в поле со списком. но помните, что Combobox будет искать datacontext itesself, а затем искать throgh к своему предку. Но здесь, поскольку ваши Get_States доступны в Windows.xaml.cs, вы будете использовать относительный источник, например

<ComboBox x:Name="ComboboxState" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" Width="120" HorizontalAlignment="Left" ToolTip="Enter your state."

                          ItemsSource="{Binding Get_States, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, UpdateSourceTrigger=PropertyChanged}"

                          DisplayMemberPath="Name" SelectedValuePath="Abbreviation"/>