none
Как грузятся элементы? RRS feed

  • Вопрос

  • Вот например есть xaml который потом baml

    если например в xaml ListView со строго заданным поряком расположения Item.

    Например я поменяю порядок Item-ов потом уже после компиляции. И не сохраню новый порядок - при последующей загрузке программы - загрузится первоначальный вариант или изменённый? Baml меняется в процессе работы?

    Или я сохраняю новое расположение в файле с настройками и при загрузке программы сначала программа грузит изначальный порядок Item_ов а потом уже через методы C# загружает новый порядок из файла настроек и по новой перерисовывает? Т.е. дважды получается грузит один и тот же контрол?


    Спасибо

    9 февраля 2013 г. 2:40

Ответы

  • Добрый день.

    Не очень понятен вопрос, но давайте попробую ответить, как понял...

    Итак. У вас есть список, который вы всегда, в одном и том же порядке считываете из базы данных или файла. Вы его, через прямое присвоение в ItemsSource или через Binding показываете в ListView. Всегда, независимо от того, что вы делали в процессе работы программы, если вы не меняли базу данных/файл, у вас при новом запуске порядок не измениться.

    Теперь по второму вопросу. Если вы хотите, перед тем, как показывать список пользователю применить к нему некие сортировки/фильтры, то никто вам не мешает считать исходную коллекцию, применить то что вы хотите и потом поместить в ItemsSource. Т.к. с файлом конфигурации и БД лень возиться, давайте покажу пример с настройками показа пользователя.

    Добавлю вот такой вспомогательный класс:

    public class Person
    {
        public string Name { get; set; }
    
        public int Age { get; set; }
    
        public override string ToString()
        {
            return string.Format("{0} - Возраст полных лет: {1}", Name, Age);
        }
    }

    Вот так, будет выглядеть разметка моей формы.

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
        <RadioButton x:Name="rbSortingByAge">Сортировать по возрасту</RadioButton>
        <RadioButton x:Name="rbSortingByName" Grid.Row="1" Content="Сортировать по ФИО"></RadioButton>        
        <Button Grid.Row="2" Click="Button_Click">Загрузить данные</Button>
        <ListView x:Name="lvMain" Grid.Row="3" />
    </Grid>

    А вот ее код:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        /// <summary>
        /// Метод эмулирующий считывание списка из внешнего источника
        /// </summary>
        private Person[] GetPersons()
        {
            return new Person[]
            {
                new Person { Name = "Петров", Age = 20 },
                new Person { Name = "Сидоров", Age = 18 },
                new Person { Name = "Иванов", Age = 22 }
            };
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            IEnumerable<Person> result = GetPersons();
            if (rbSortingByName.IsChecked != null && rbSortingByName.IsChecked.Value)
            {
                result = result.OrderBy(p => p.Name);
            }
            else if (rbSortingByAge.IsChecked != null && rbSortingByAge.IsChecked.Value)
            {
                result = result.OrderBy(p => p.Age);
            }
            lvMain.ItemsSource = result;
        }
    }

    Запускаем:

    Если интересно, можете поставить точку останова в метод GetPersons и убедиться, что один клик на кнопке = одна загрузка списка.

    • Помечено в качестве ответа developers_s 9 февраля 2013 г. 8:36
    9 февраля 2013 г. 7:20
    Отвечающий
  • Вы все написали правильно. Только если у вас в XAML задан список Item, а при загрузке вы сразу меняете его в коде, то получается что устанавливаете значение 2 раза. Но если вы собираетесь указывать значение в коде, то его не зачем указывать в XAML, а иначе вы не внимательный разработчик.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа developers_s 9 февраля 2013 г. 8:36
    9 февраля 2013 г. 7:27
    Отвечающий

Все ответы

  • Добрый день.

    Не очень понятен вопрос, но давайте попробую ответить, как понял...

    Итак. У вас есть список, который вы всегда, в одном и том же порядке считываете из базы данных или файла. Вы его, через прямое присвоение в ItemsSource или через Binding показываете в ListView. Всегда, независимо от того, что вы делали в процессе работы программы, если вы не меняли базу данных/файл, у вас при новом запуске порядок не измениться.

    Теперь по второму вопросу. Если вы хотите, перед тем, как показывать список пользователю применить к нему некие сортировки/фильтры, то никто вам не мешает считать исходную коллекцию, применить то что вы хотите и потом поместить в ItemsSource. Т.к. с файлом конфигурации и БД лень возиться, давайте покажу пример с настройками показа пользователя.

    Добавлю вот такой вспомогательный класс:

    public class Person
    {
        public string Name { get; set; }
    
        public int Age { get; set; }
    
        public override string ToString()
        {
            return string.Format("{0} - Возраст полных лет: {1}", Name, Age);
        }
    }

    Вот так, будет выглядеть разметка моей формы.

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
        <RadioButton x:Name="rbSortingByAge">Сортировать по возрасту</RadioButton>
        <RadioButton x:Name="rbSortingByName" Grid.Row="1" Content="Сортировать по ФИО"></RadioButton>        
        <Button Grid.Row="2" Click="Button_Click">Загрузить данные</Button>
        <ListView x:Name="lvMain" Grid.Row="3" />
    </Grid>

    А вот ее код:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        /// <summary>
        /// Метод эмулирующий считывание списка из внешнего источника
        /// </summary>
        private Person[] GetPersons()
        {
            return new Person[]
            {
                new Person { Name = "Петров", Age = 20 },
                new Person { Name = "Сидоров", Age = 18 },
                new Person { Name = "Иванов", Age = 22 }
            };
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            IEnumerable<Person> result = GetPersons();
            if (rbSortingByName.IsChecked != null && rbSortingByName.IsChecked.Value)
            {
                result = result.OrderBy(p => p.Name);
            }
            else if (rbSortingByAge.IsChecked != null && rbSortingByAge.IsChecked.Value)
            {
                result = result.OrderBy(p => p.Age);
            }
            lvMain.ItemsSource = result;
        }
    }

    Запускаем:

    Если интересно, можете поставить точку останова в метод GetPersons и убедиться, что один клик на кнопке = одна загрузка списка.

    • Помечено в качестве ответа developers_s 9 февраля 2013 г. 8:36
    9 февраля 2013 г. 7:20
    Отвечающий
  • Вы все написали правильно. Только если у вас в XAML задан список Item, а при загрузке вы сразу меняете его в коде, то получается что устанавливаете значение 2 раза. Но если вы собираетесь указывать значение в коде, то его не зачем указывать в XAML, а иначе вы не внимательный разработчик.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа developers_s 9 февраля 2013 г. 8:36
    9 февраля 2013 г. 7:27
    Отвечающий
  • просто привык уже к XAML. Ну типа разделение интерфейс - Xaml а данные C# а так получается как возврат к Forms,


    Спасибо

    9 февраля 2013 г. 8:38
  • Я Алексей про то чтобы вот например отсортировать как у Вас сделано (в блоге тоже у Вас хороший пример есть про это дело), но чтобы при следующей загрузке программы сразу было всё отсортировано по новому, то мне необходимо где то сохранить такой порядок сортировки. А потом при загрузке программы Item сначала подгрузятся в первоначальном виде, а потом уже отсортируются. Ну в моём вопросе речь скорее не о данных, а о самих "контейнерах". Ну например FlipView если в xaml стоит такая последовательность Grid1, Grid2, то отсортировав в C# и поменяв местами Grid2, Grid1 и сохранив такой порядок в локальных сеттингах, при загрузке программы сначала FlipView загрузит Grid1, Grid2 а потом уже в C# поменяет Grid2 на Grid1 ну т.е. двойная работа.

    Получается FlipView надо делать в Xaml а всё содержимое FlipView формировать через C# - шаг назад к Forms технологии


    Спасибо

    9 февраля 2013 г. 8:45
  • Не знаю как вы, а я в WinForms все что нужно делал в дизайнере формы, а в коде этим оперировал, в WPF же создаю только каркас, а наполнение делаю в коде, поэтому где вы усмотрели шаг назад я не понимаю. Именно отделение данных от макета и является шагом вперед сделанным в WPF.

    Я сейчас переписываю свою программку уже в версии 4.5, а у меня есть маниакальное пристрастие писать каждую новую версию с нуля (ну кроме мелких изменений). Так у меня идет параллельно написание класса данных и логики его сохранения в файл настроек. И да выходит, что сначала строится макет "по умолчанию", а потом по загруженным настройкам, но это происходит так быстро и так не затратно по ресурсам, что не зная принципа работы это не возможно заметить.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    9 февраля 2013 г. 8:51
    Отвечающий