所有变量都在这里,我不是语法应该是什么。
我正在尝试创建一个下拉搜索框过滤器。搜索框字段使用以下代码动态填充
<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 = "";
另一个
答案 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())
将它们连接起来;