【问题标题】:Update source in datagrid via selection from combo box通过从组合框中选择更新数据网格中的源
【发布时间】:2013-10-08 13:35:55
【问题描述】:

我是 WPF 和 MVVM 设计模式的新手。因此,我尝试做的每件事似乎都需要很长时间。

目前,我正在使用组合框来选择一个列表。我想用该列表中的所有联系人填充 Gridview,并在每次 Combobox 选择更改时刷新该 Gridview。

视图的 XAML 如下所示。如何让 Gridview 监听 Co​​mbobox 选择的变化?我需要 Combobox 选择来设置它的属性,以便我可以查询数据库以返回与列表关联的那些记录,所以我的第一个想法是添加一个按钮来触发命令,但它永远不会触发。我在谷歌上读过它说 Gridview 应该监听 PropertyUpdated 但没有关于如何做到这一点的示例。

我在 Gridview 中尝试过,但抛出异常,是的,我的 ViewModel 确实实现了 INotifyProperyChanged

PropertyChanged="{绑定路径=SelectedListNameContactView}

感谢您的帮助。

<UserControl x:Name="manageLists"
         x:Class="Five9ContactManagement.ManageListsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
         xmlns:my="clr-namespace:Five9ContactManagement.Controls;assembly=Five9ContactManagement.Controls"
         mc:Ignorable="d"
         d:DesignHeight="400"
         d:DesignWidth="400"
         xmlns:local="clr-namespace:Five9ContactManagement">


 <Grid>
   <Grid HorizontalAlignment="Center"
         VerticalAlignment="Top"
         Margin="20">
      <Grid.ColumnDefinitions>
       <ColumnDefinition />
       <ColumnDefinition />
       <ColumnDefinition />
     </Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
      </Grid.RowDefinitions>

      <TextBlock  Grid.Column="0"
              Grid.Row="2"
              Text="Select List "
              VerticalAlignment="Center"
              Margin="5" />

      <ComboBox Grid.Column="1"
            Grid.Row="2"
            ItemsSource="{Binding GetLists, Mode=OneWay}"
            VerticalAlignment="Center"
            SelectedIndex="-1"
            SelectedItem="{Binding Path=SelectedListNameContactView />

            <Button Grid.Row="2"
                 Grid.Column="2"
                 Content="View Contacts"
                 VerticalAlignment="Center"
                 Margin="5" 
                 Width=" 100"
                Command="{Binding Path=ShowContactsCommand}"   
                CommandParameter="{Binding SelectedListNameContactView}"/>

</Grid>
<Grid HorizontalAlignment="Center"
      VerticalAlignment="Center"
      Margin="20"
      RenderTransformOrigin="1.25,2.662">

  <telerik:RadGridView x:Name="contactsGrid"
                       GroupRenderMode="Flat"
                       ItemsSource="{Binding Contacts}"
                       PropertyChanged="{Binding Path=SelectedListNameContactView}                                
                             AutoGenerateColumns="False"

                             CanUserFreezeColumns="False"
                             RowIndicatorVisibility="Collapsed"
                             CanUserResizeColumns="True"
                             Margin="5,5,5,5" 
                             IsReadOnly="True">
      <telerik:RadGridView.Columns>
      <telerik:GridViewDataColumn Header="First Name"
                                  DataMemberBinding="{Binding FirstName}"
                                  Width="100" />
      <telerik:GridViewDataColumn Header="Last Name"
                                  DataMemberBinding="{Binding LastName}"
                                  Width="100" />
      <telerik:GridViewDataColumn Header="Address"
                                  DataMemberBinding="{Binding Address}"
                                  Width="200" />
      <telerik:GridViewDataColumn Header="Address2"
                                  DataMemberBinding="{Binding Address2}"
                                  Width="75" />
      <telerik:GridViewDataColumn Header="City"
                                  DataMemberBinding="{Binding City}"
                                  Width="75" />
      <telerik:GridViewDataColumn Header="State"
                                  DataMemberBinding="{Binding State}" />
      <telerik:GridViewDataColumn Header="Zip"
                                  DataMemberBinding="{Binding ZipCode}"
                                  Width="75" />
      <telerik:GridViewDataColumn Header="Phone"
                                  DataMemberBinding="{Binding PhoneNumber}"
                                  Width="75" />
      <telerik:GridViewDataColumn Header="Media Group"
                                  DataMemberBinding="{Binding MediaGroup}"
                                  Width="100" />
      <telerik:GridViewDataColumn Header="Brochure Date"
                                  DataMemberBinding="{Binding BrochureDate}"
                                  Width="100" />
    </telerik:RadGridView.Columns>
  </telerik:RadGridView>

</Grid>

【问题讨论】:

    标签: c# wpf gridview mvvm combobox


    【解决方案1】:

    使用 MVVM,对于这样的功能,我们使用视图模型而不是视图。首先添加与ComboBox 控件中的项目相同类型的属性...为简单起见,我将假设它们是string 值:

    private string selectedItem = string.Empty;
    ...
    public string SelectedItem
    {
        get { return selectedItem; }
        set
        {
            selectedItem = value;
            NotifyPropertyChange("SelectedItem"); // << Implement INotifyPropertyChanged
            UpdateGrid();
        }
    }
    

    现在为您的DataGrid 添加一个集合属性:

    private ObservableCollection<string> items = new ObservableCollection<string>();
    ...
    public ObservableCollection<string> Items
    {
        get { return items; }
        set
        {
            items= value;
            NotifyPropertyChange("Items"); // << Implement INotifyPropertyChanged
        }
    }
    

    现在让我们看看UpdateGrid 方法:

    private void UpdateGrid()
    {
        // Update your property that is bound to the DataGrid.ItemsSource here
        Items = GetNewData(); // << You need to implement this method yourself
    }
    

    现在,在 XAML 中:

    <DataGrid ItemsSource="{Binding Items}" />
    <ComboBox ItemsSource="{Binding YourCollectionNotShownHere}" 
        SelectedItem="{Binding SelectedItem}" />
    

    现在,每当 ComboBox.SelectedItem 更改时,将调用 SelectedItem 属性设置器,这将调用 UpdateGrid() 方法,该方法将更新 Items 集合属性并更新 DataGrid 中的集合.正如示例中的注释所说,您将需要在您的视图模型中实现INotifyPropertyChanged 接口。

    【讨论】:

    • 这正是我设置它的方式。网格不填充,它正在返回记录。如果我将初始网格设置为显示与我的列表之一关联的记录,它会很好地填充。从组合框中选择一些东西,它会命中代码,但网格不会更新。在winforms中,您可以进行刷新。不使用 WPF。我找到了一个链接,它基本上重新加载了本质上重绘它的应用程序。除非我在这里找到更好的答案,否则我会试一试。这是链接顺便说一句。 codeproject.com/Articles/158591/…
    • 天哪……我忘了为我的收藏提出 OnPropertyChanged 事件……感谢您的帮助
    • 很高兴看到您坚持解决问题。如果您的问题现已解决,请accept the answer that you believe is the best solution to your problem 让其他用户知道是什么帮助解决了问题。
    【解决方案2】:

    如果您将使用交互和交互库,您将能够在 xaml 中编写类似的内容:

     <ComboBox HorizontalAlignment="Left" SelectedItem="{Binding SelectedComboBoxItem, Mode=TwoWay}" ItemsSource="{Binding ComboBoxItems}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding OnCopmboBoxSelectionChangedCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ComboBox>
    

    和 viewModel 中的命令:

     private ICommand _onCopmboBoxSelectionChangedCommand;
     public ICommand OnCopmboBoxSelectionChangedCommand
     {
         get
         {
             if (_onCopmboBoxSelectionChangedCommand != null) return _onCopmboBoxSelectionChangedCommand;
             _onCopmboBoxSelectionChangedCommand = new RelayCommand(OnCopmboBoxSelectionChanged);
             return _onCopmboBoxSelectionChangedCommand;
         }
     }
    

    viewModel 中的最终方法:

     private void OnCopmboBoxSelectionChanged(object sender)
     { }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2019-08-08
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多