通过从组合框中选择来更新数据网格中的源

时间:2013-10-08 13:35:55

标签: c# wpf gridview mvvm combobox

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

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

视图的XAML如下。如何让gridview听取组合框选择的变化?我需要组合框选择来设置它的属性,以便我可以查询数据库以返回与列表关联的那些记录,所以我首先想到的是添加一个按钮来触发命令,但它永远不会触发。我在google上看过,它说gridview应该监听属性更新但是没有关于如何做的样本。

我在gridview中尝试了这个但是抛出异常,是的,我的viewmodel确实实现了INotifyProperyChanged

PropertyChanged =“{Binding Path = 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>
</Grid>

2 个答案:

答案 0 :(得分:0)

如果您将使用Interactivity和交互库,您将能够在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中的finally方法:

 private void OnCopmboBoxSelectionChanged(object sender)
 { }

答案 1 :(得分:0)

使用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接口。