我的第一个WPF / MVVM应用程序

时间:2009-09-22 20:37:50

标签: wpf mvvm

好的..我有点迷失了。我拥有的是

window1.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");
            }
        }

2 个答案:

答案 0 :(得分:0)

您将SelectedItem上的ComboBox绑定到ViewModel中的另一个属性(不是集合)。

然后添加button并将Command绑定到ViewModel中的ICommand。 此命令应使用selectedItem显示该仪表板。

(也许有一种方法可以在不添加按钮的情况下完成,但我自己就是MVVM新手并且不知道怎么做)

答案 1 :(得分:0)

有很多方法可以实现这个......

我的建议是,现在你有两个独立的“视图/模型” - 你需要一些东西来组合/集成它们 - 你可以再次使用MVVM模式 - 我现在正在假设window1.xaml是为了做到这一点。

因此,您可以将window1.xaml重命名为mainView.xaml,然后添加一个mainViewModel.cs。然后,就像Eduardo说的那样,制作一个存取器但是把它放在你的mainViewModel.cs中 - 你可以把它叫做selectedEnvironment&amp; selectedDashboard。如果你那时你的用户控制“Enviroment”&amp;主视图上的“仪表板”可以绑定它们。

现在,看看你的ViewModel,我不确定你打算如何将基于environmentModel的相关数据传递给dashboardModel - 你需要设置某种关系 - 你可以在EnviromentViewModel或mainViewModel ...但我现在看不到任何明确的关系?如果您打算基于访问者数据建立关系,您需要将其作为一种常见类型吗?

另外,在旁注中我注意到你确定为什么你把_data作为公共,因为你已经创建了公共访问者数据,你肯定想要保留_data吗?