Search code examples
c#wpfxamllistviewtextbox

Binding ListView to filter selected item from another ListView


I have two ListView items in a WPF application that I'm developion. They are both connected to Datasets in the Presenter ViewModel in my application.

My original idea was to load my SelectedItem in my ListView into a TextBox, and then have that fire off a filter for the second ListView

However, I've run into a problem: I want to filter by number, and the TextBox only seems to want to take in text. Is there a workaround for this?

Here is my XAML

<Grid Margin="5,2,5,2" Height="350">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>
    <ListView x:Name="TypeView" Grid.Column="0" ItemsSource="{Binding CashActivityTypes}" Margin="0,0,10,0">
        <ListView.View>
            <GridView>
                <!--This is the column I want to get -->
                <GridViewColumn Header="Sequence" DisplayMemberBinding="{Binding Sequence}" Width="75"/>
                <GridViewColumn Header="Activity Type" DisplayMemberBinding="{Binding Type}" Width="200"/>
                <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" Width="Auto"/>
            </GridView>
        </ListView.View>
    </ListView>
    <ListView Grid.Column="1" Margin="10,2,0,2">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Sequence" Width="75"/>
                <GridViewColumn Header="Activity" Width="200"/>
                <GridViewColumn Header="Description" Width="Auto"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
<Grid Margin="5,2,5,2">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>
    <TextBox Text="{Binding SelectedItem.Sequence, ElementName=TypeView, UpdateSourceTrigger=PropertyChanged}" Width="150" HorizontalAlignment="Left"/>
    <Button Grid.Column="1" Content="Adjust Daily Cash Activity" MinWidth="150" Height="20" HorizontalAlignment="Right"/>
</Grid>

Solution

  • You can do two-way binding on the 1st listview selectedItem property to VievModel:

    private <TYPE> _CashActivityTypeSelected;
    
    public <TYPE> CashActivityTypeSelected 
    {
    get
     {
       return _CashActivityTypeSelected;
     }
    set
    {
      _CashActivityTypeSelected=value; 
      FilterMySecondCollectionView(value);
     };
    

    in xaml:

    <ListView SelectedItem="{Binding CashActivityTypeSelected, mode=TwoWay}" x:Name="TypeView" Grid.Column="0" ItemsSource="{Binding CashActivityTypes}" Margin="0,0,10,0">
            <ListView.View>
                <GridView>
                    <!--This is the column I want to get -->
                    <GridViewColumn Header="Sequence" DisplayMemberBinding="{Binding Sequence}" Width="75"/>
                    <GridViewColumn Header="Activity Type" DisplayMemberBinding="{Binding Type}" Width="200"/>
                    <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" Width="Auto"/>
                </GridView>
            </ListView.View>
        </ListView>
    

    and then in FilterMySecondCollectionView(object t) you can apply whatever filter you want based on selected object.