Wpf 带有文本框caliburn.micro的Datagrid筛选列

Wpf 带有文本框caliburn.micro的Datagrid筛选列,wpf,datagrid,filter,filtering,caliburn.micro,Wpf,Datagrid,Filter,Filtering,Caliburn.micro,我想我想做一个过滤器列条码。 在本专栏中,我有一个转换器来转换字符串中的EAN列表。课程内容如下: public class EanListToStringConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return String.

我想我想做一个过滤器列条码。 在本专栏中,我有一个转换器来转换字符串中的EAN列表。课程内容如下:

public class EanListToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                  object parameter, CultureInfo culture)
    {
        return String.Join("\r", ((List<Ean>)value).Select(ean => ean.Codice));
    }
    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        return NotSupportedException();
    }

    private object NotSupportedException()
    {
        throw new NotImplementedException();
    }
}
公共类EANListToString转换器:IValueConverter
{
公共对象转换(对象值,类型targetType,
对象参数,CultureInfo(区域性)
{
返回字符串.Join(“\r”,((列表)值)。选择(ean=>ean.Codice));
}
公共对象转换回(对象值,类型targetType,
对象参数,CultureInfo(区域性)
{
return NotSupportedException();
}
私有对象NotSupportedException()
{
抛出新的NotImplementedException();
}
}
所以我想知道,如果用户在文本框中写一个条形码,它将过滤DataGrid列表

<DataGrid HorizontalAlignment="Stretch" SelectedItem="{Binding SelectedArticle}"
            Margin="14,89,12,61" VerticalAlignment="Stretch" AutoGenerateColumns="False" x:Name="List">
   <DataGrid.Columns>
      <DataGridTextColumn Width="100" Binding="{Binding Code}" Header="Code" />
      <DataGridTextColumn Width="300" Binding="{Binding Description}" Header="Description" />
      <DataGridTextColumn Binding="{Binding Price}" Header="Price" />
      <DataGridTextColumn Binding="{Binding Ean, Converter={StaticResource EanListToString}}" Header="Bar Codes" />
   </DataGrid.Columns>
</DataGrid>

这是视图模型

   [Export(typeof(IScreen))]
   public class BViewModel : Screen
   {
      public List<Articolo> List { get; private set; }
      public Article SelectedArticle { get; set; }

      [Import]
      WindowManager WindowManager = new WindowManager();

      public BolleViewModel()
      {
         List = recover.GetArticles();
         NotifyOfPropertyChange("List");
      }
   }
[导出(typeof(IScreen))]
公共类BViewModel:屏幕
{
公共列表{get;private set;}
公共项目选定的项目{get;set;}
[进口]
WindowManager WindowManager=新的WindowManager();
公共BolleViewModel()
{
List=recover.GetArticles();
财产变更通知(“清单”);
}
}

我能做什么?谢谢..

从视图开始,我建议您首先使用DataGridTemplateColumn,特别是CellTemplate,以便您可以在其中放置自己的自定义控件,例如ComboBox。从那以后,您应该能够轻松地定义您需要的控件,并将其绑定到您的类中

下面是一个粗略的例子

 <DataGrid.Columns>
    <DataGridTemplateColumn Header="Bar Codes">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox ItemsSource="{Binding Ean, Converter={StaticResource EanListToString}}"></ComboBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
        ...

...

使用带有HeaderTemplate的DataGridTemplate列,HeaderTemplate具有用于筛选的文本框输入

<DataGridTemplateColumn Width="80" SortMemberPath="Naam" Header="Naam">
    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <Grid>
                <StackPanel Orientation="Vertical">
                    <TextBlock>Naam</TextBlock>
                    <TextBox Text="{Binding Delay=200, RelativeSource={RelativeSource AncestorType={x:Type UserControl }}, Path=DataContext.Filter.Naam, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Text="{Binding}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>1

好的,但是告诉我这个错误:“双向绑定需要路径或XPath。”你能告诉我你正在使用的{binding..}和你绑定到的代码吗?绑定到的数据必须有一个getter和setter才能工作。
public class Filter:INotifyPropertyChanged//Todo implement interface
{
   private string name;
   public string Name 
   {
      get{return name;}
      set{name = value; OnPropertyChanged("Name");}
   }
}