Мое первое приложение WPF/MVVM

Итак.. Я немного потерялся. У меня есть

окно1.xaml

просто поле со списком, которое выбирает разные среды

то у меня есть, который отображает данные в зависимости от среды

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

Вопрос. Я хочу, чтобы данные информационных панелей менялись при выборе другой среды.

Я боролся с этим уже день, и я ничего не получаю ... Любая помощь будет оценена ...

Код пока:

EnvironmentView.xaml

 <UserControl.DataContext>
        <vm:EnvironmentViewModel />
    </UserControl.DataContext>
    <StackPanel Orientation="Horizontal">
        <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Center" Text="Environment:" Margin="0,0,5,0" />
        <ComboBox  x:Name="environments"  ItemsSource="{Binding Data}" SelectedItem="{Binding Data}" SelectedIndex="0" ></ComboBox>
    </StackPanel>

EnivronmentViewModel.cs

  public class EnvironmentViewModel : BaseModelView {
        public ObservableCollection<string> _data;
        public ObservableCollection<string> Data
        {
            get {
                if (this._data == null)
                {
                    _data = new ObservableCollection<string>();
                    foreach (ConnectionStringSettings connectionString in ConfigurationManager.ConnectionStrings)
                    {
                        this._data.Add(connectionString.Name);
                    }
                }
                return this._data;
            }
            set {
                if (_data == value) return;
                _data = value;
                OnPropertyChanged("Data");
            }
        }

DashboardView.xaml

<UserControl.DataContext>
        <viewmodel:DashboardViewModel  />
    </UserControl.DataContext>
    <Border Style="{StaticResource ThickBorderStyle}">
        <StackPanel>
            <TextBlock Text="Current Bugs" />
            <data:DataGrid x:Name="dataview" Width="Auto" Height="Auto" ItemsSource="{Binding Data}">
            </data:DataGrid>
        </StackPanel>
    </Border>

DashboardViewModel.cs

private DashboardRepository _repository;
        public ObservableCollection<DashBoardCount> _data;
        public DashboardViewModel() {
            _repository = new DashboardRepository();
        }

        public ObservableCollection<DashBoardCount> Data
        {
            get
            {
                if(this._data==null)
                {
                    IQuery q = new Query() { ConnectionStringKey = this.ConnectionStringKey };
                    _data = this._repository.Get(q);
                }
                return _data;
            }
            set {
                if (_data == value) return;
                _data = value;
                OnPropertyChanged("Data");
            }
        }

person Societymedia    schedule 22.09.2009    source источник


Ответы (2)


Вы показываете привязку SelectedItem к ComboBox другому свойству в ViewModel (не к коллекции).

Затем добавьте button и привяжите Command к ICommand в своей ViewModel. Эта команда должна использовать selectedItem, чтобы показать эту панель мониторинга.

(Может быть, есть способ сделать это без добавления кнопки, но я сам новичок в MVVM и не знаю, как это сделать)

person Eduardo Molteni    schedule 16.10.2009

Есть несколько способов реализовать это...

Мое предложение заключалось бы в том, что прямо сейчас у вас есть два отдельных «представления/модели» — и вам нужно что-то, чтобы объединить/интегрировать их — что вы могли бы сделать, снова используя шаблон MVVM — я предполагаю, что прямо сейчас window1.xaml предназначен для сделай это.

Таким образом, вы можете переименовать window1.xaml во что-то вроде mainView.xaml, а затем добавить mainViewModel.cs. Затем, как сказал Эдуардо, создайте аксессор, но поместите его в свой mainViewModel.cs — вы можете назвать его как-то вроде selectedEnvironment & selectedDashboard. Если бы у вас были пользовательские элементы управления «Среда» и «Панель инструментов» в mainView, вы могли бы связать их.

Однако прямо сейчас, глядя на ваши ViewModels, я не уверен, как вы собираетесь передавать соответствующие данные на основе модели среды в модель панели - вам нужно будет установить какую-то связь - вы можете либо сделать это в EnviromentViewModel, либо mainViewModel... но я не вижу явных отношений прямо сейчас? Если вы предполагаете, что отношения будут основаны на данных доступа, вам нужно сделать это общего типа?

Кроме того, в примечании я уверен, почему вы сделали _data общедоступными, поскольку вы создали общедоступные данные для доступа, наверняка вы хотели бы сохранить _data?

person Mark Pearl    schedule 25.12.2009