Проблема Привязка массива процессов к WPF ListBox - PullRequest
0 голосов
/ 26 сентября 2011

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

Изучив документы MSDN для DataBinding с коллекциями, я создал свой собственный класс ProcessList, который наследуется от ObservableCollection. Класс теперь совершенно пустой, я раньше возился с ним, пытаясь заставить вещи работать, так что я думаю, что я мог бы просто работать прямо с ObservableCollection, но в любом случае. Вот что у меня на данный момент:

    public partial class MainWindow : Window
    {
        private Dictionary<int, Injector> injectors;
        public Process[] processes;
        public ProcessList procList;

        public MainWindow()
        {
            procList = new ProcessList();
            foreach (var p in Process.GetProcesses())
            {
                procList.Add(p);
            }
            InitializeComponent();
            processGrid.DataContext = procList;
        }

        private void button_refresh_processes_Click(object sender, RoutedEventArgs e)
        {
            processes = Process.GetProcesses();
        }
    }
}

И соответствующий XAML:

<Grid Name="processGrid" Margin="0,21,0,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="348*" />
                        <ColumnDefinition Width="145*" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="147*" />
                        <RowDefinition Height="42*" />
                    </Grid.RowDefinitions>
                    <Button Content="Inject" Grid.Row="1" Height="23" HorizontalAlignment="Center" Margin="0,0,0,0" Name="button_inject" VerticalAlignment="Center" Width="75" />
                    <ListBox Height="147" HorizontalAlignment="Left" Name="process_list" VerticalAlignment="Top" Width="348" ItemsSource="{Binding Path=ProcessName}" />
                    <Grid Grid.Column="1" Height="147" HorizontalAlignment="Left" Name="grid2" VerticalAlignment="Top" Width="145">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="1*" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="1*" />
                        </Grid.ColumnDefinitions>
                        <Label Content="Process ID:" Grid.RowSpan="1" Height="28" HorizontalAlignment="Left" Margin="0" Name="label_pid" VerticalAlignment="Center" />
                        <Label Content="PID" Grid.Column="1" Grid.RowSpan="1" Height="28" HorizontalAlignment="Right" Margin="0" Name="label_pid_value" VerticalAlignment="Center" />
                    </Grid>
                    <Button Content="Refresh" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="6,9,0,0" Name="button_refresh_processes" VerticalAlignment="Top" Width="75" Click="button_refresh_processes_Click" />
                </Grid>

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

Я понятия не имею, что происходит, хотя я уверен, что делаю что-то чрезвычайно глупое, так как я очень плохо знаком с разработкой WPF и привязкой данных.

1 Ответ

1 голос
/ 26 сентября 2011

Мне интересно, почему вы вообще получаете вывод.

ItemsSource="{Binding Path=ProcessName}"

Означает, что источником элементов является ProcessName.Имя - это строка, а строка - IEnumerable<Char>.Таким образом, список отображает каждый символ как одну запись.

Вы должны установить ItemsSource для самого списка.В вашем случае это будет

ItemsSource="{Binding}"

, поскольку ProcessList уже является контекстом данных вашей сетки, которая наследуется списку.

Если вы не используете модель представленияВ классе (который рекомендуется при работе с шаблоном MVVM) вы можете сделать DataContext = this; в конструкторе Windows, чтобы установить для контекста данных окна свой собственный код.Если вы сделаете это, привязка вашего списка изменится на

ItemsSource="{Binding procList}"

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

Версия TL; DR: если вы хотите в полной мере использовать WPF, вам понадобятся руководства по XAML / Bindings и шаблону MVVM.

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