【问题标题】:Datagrid filtering column with a textbox ,caliburn.micro带有文本框的 Datagrid 过滤列 caliburn.micro
【发布时间】:2013-05-31 17:28:45
【问题描述】:

我想对条形码列进行过滤。 在本专栏中,我有一个转换器来转换字符串中的 Eans 列表。类是这样的:

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();
    }
}

所以我希望如果用户在 TEXTBOX(或其他东西)中写一个条形码,它将过滤 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");
      }
   }

我能做什么?谢谢..

【问题讨论】:

    标签: wpf datagrid filter filtering caliburn.micro


    【解决方案1】:

    从视图开始,我建议您从使用 DataGridTemplateColumn,特别是 CellTemplate 开始,这样您就可以在其中放置自己的自定义控件,例如组合框。然后你应该从那里自定义你需要的控件并将其绑定到你的类中

    下面的粗略示例

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

    【讨论】:

      【解决方案2】:

      将 DataGridTemplateColumn 与 HeaderTemplate 一起使用,该 HeaderTemplate 具有用于过滤的 TextBox 输入。

      <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
      

      型号

      public class Filter:INotifyPropertyChanged//Todo implement interface
      {
         private string name;
         public string Name 
         {
            get{return name;}
            set{name = value; OnPropertyChanged("Name");}
         }
      }
      

      【讨论】:

      • 好的,但是给我这个错误:“双向绑定需要 Path 或 XPath。”
      • 您能告诉我您正在使用的 {Binding .. } 以及您要绑定的代码吗?您要绑定的数据必须有一个 getter 和 setter 才能工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多