处理多个字段的过滤的最佳方式

时间:2018-03-16 21:10:11

标签: c# wpf xaml mvvm dataview

所有变量都在这里,我不是语法应该是什么。

我正在尝试创建一个下拉搜索框过滤器。搜索框字段使用以下代码动态填充

<ItemsControl ItemsSource="{Binding Vwr.Table.Vals, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Col}" Style="{StaticResource tabTextBlock}"/>
            <TextBox Text="{Binding Val}" Style="{StaticResource tabTextBox}" Width="200"/>
            <TextBlock Text="{Binding CTStr}" Style="{StaticResource tabTextBlock}"/>
        </StackPanel>
    </DataTemplate>
</ItemsControl.ItemTemplate>

Col :列名称

Val :文本框内的值

CTStr :dataType

c#中RowFilter的语法类似于下面的内容(msdn

Col LIKE'%”+ Val +“%'+”AND“+” Col LIKE'%“+ Val +“%”  ......“

所以我需要做的是调用一个ICommand,只要其中一个动态生成的文本字段被更新就会启动,当调用时会检查当前的RowFilter字符串,然后,如果它已经有字段过滤,则会附加AND然后它是自己的过滤字符串。

是否可以设置文本框以在用户编辑文本框字段时随时使用Col和文本框内的值作为命令参数启动ICommand?

我想到的另一个解决方案是以某种方式将文本框放入存储DataView的Vwr.Table的范围内。 (目前它的源绑定到Vwr.Table.Vals)从那里我将它绑定到一个更新数据视图的字符串,如此,

public string Filter
{
    get { return _Filter; }
    set
    {
        _Filter = value; OnPropertyChanged(nameof(Filter));
        MainVM.Modules.AllModules[0].Vwr.Table.dv.RowFilter = Col + " LIKE '%" + _Filter + "%'";
    }
}
private string _Filter = "";

另一个

1 个答案:

答案 0 :(得分:1)

关键是将DataTemplate Item作为命令参数传递。以及使用relativeSource获取需要的数据。

<ItemsControl ItemsSource="{Binding Vwr.Table.Vals, UpdateSourceTrigger=PropertyChanged}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" x:Name="Item">
            <TextBlock x:Name="SearchCol" Text="{Binding Col}" Style="{StaticResource tabTextBlock}"/>
            <TextBox x:Name="SearchText" Text="{Binding Filter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="TextChanged">
                        <i:InvokeCommandAction Command="{Binding Path=DataContext.Modules.SelectedModule.Vwr.Table.FilterCommand, RelativeSource={RelativeSource Mode=FindAncestor,
                                     AncestorType={x:Type Window}}, UpdateSourceTrigger=PropertyChanged}" CommandParameter="{Binding ElementName=Item, Path=DataContext}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>
            <TextBlock Text="{Binding CTStr}" Style="{StaticResource tabTextBlock}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我使用此代码获取我需要的上下文,将整个dataItem作为命令参数发送,然后将该数据解析为字符串列表。然后我打电话给RowFilter = string.join( " AND " , FilterList.ToArray())将它们连接起来;