如何在listview控件中设置Selected Item?

时间:2012-08-16 06:30:16

标签: wpf xaml data-binding mvvm

我在项目中有UserControl(AllCustomerView),它的Viewmodel作为ALlCustomerViewModel包含一个属性SearchText。 SearchText是UserControl中listview内TextBox的选定值。 SearchItem设置为SearchText的customerViewmdel。 但在listview中,SearchItem未设置为选中

在AllCustomerView.xaml中

<TextBlock>
<TextBox 
        Width="150" 
        Text="{Binding Path=SearchText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
</TextBox>
<Button 
         Command="{Binding Path=SearchCommand}"
         Content=" Search ">
</Button>
</TextBlock>

<ListView
            SelectedValue="{Binding Path=SearchText}"
            ItemsSource="{Binding Path=AllCustomers}"
            FontFamily="Tahoma"
            FontSize="14"
            ItemContainerStyle="{StaticResource CustomerItemStyle}" 
            IsSynchronizedWithCurrentItem="True">
            <ListView.View>
                <GridView>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button 
                                    Command="{Binding ElementName=Root, Path=DataContext.DeleteCommand}"
                                    Content="x"
                                    FontFamily="Tahoma"
                                    FontSize="10"
                                    />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button 
                                     FontFamily="Tahoma"
                                    FontSize="10"
                                    Content="Edit"
                                    Command="{Binding Path=DataContext.Editcommand,ElementName=Root}"
                                    />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn
                        Header="CustomerID"
                        Width="130"
                        DisplayMemberBinding="{Binding Path=CustomerID}"/>
                    <GridViewColumn
                        Header="Contact Name"
                        Width="130"
                        DisplayMemberBinding="{Binding Path=ContactName}"/>
                    <GridViewColumn
                        Header="Company Name"
                        Width="130"
                        DisplayMemberBinding="{Binding Path=CompanyName}"/>
                    <GridViewColumn
                        Width="130"
                        Header="Contact Name"
                        DisplayMemberBinding="{Binding Path=ContactTitle}"
                        />
                </GridView>
            </ListView.View>
        </ListView>

及其viewmodel(AllcustomerViewModel.cs)

public ICommand SearchCommand
        {
            get
            {
                if (_search == null)
                    _search = new Relaycommand(SearchCustomer);
                return _search;
            }
        }

 public void SearchCustomer(object o)
 {
            System.Windows.Forms.MessageBox.Show(SearchItem.ToString());

}

 public string searchText;
 public string SearchText
 {
     get { return searchText; }
     set 
     {
       searchText = value;
       var customerExsits = AllCustomers.Where(q => q.CustomerID.Trim().Equals(searchText));
        if (customerExsits.Any())
                {
                    SearchItem = customerExsits.Single();
                }

            }
        }

public CustomerViewModel SearchItem
{
            get;
            set;
}

我应该在ListView的SelectedValue中设置什么,是设置Customerviewmodel(作为SelectedItem)还是设置CustomerID(作为SearchText)?

1 个答案:

答案 0 :(得分:2)

您应该执行以下操作:

  1. ListViewSelectedItem="{Binding Path=SearchItem }"中使用此约束。请勿使用SelectedValue
  2. 在ViewModel中实施INotifyPropertyChanged,并在PropertyChanged属性的setter中引发SearchItem事件。显然,您需要将此属性从自动属性更改为具有后备字段的经典属性:

    public CustomerViewModel SearchItem
    {
        get { return _searchItem; }
        set
        {
            if(value == _searchItem)
                return;
            _searchItem = value;
            RaisePropertyChanged("SearchItem");
        }
    }