/// <summary>
 /// Filter attached property to attach the DataGridFilterHost instance to the owning DataGrid.
 /// This property is only used by code and is not accessible from XAML.
 /// </summary>
 /// <param name="dataGrid">The data grid.</param>
 /// <returns>The <see cref="DataGridFilterHost"/></returns>
 public static DataGridFilterHost GetFilter(this DataGrid dataGrid)
 {
     if (dataGrid.GetValue(FilterProperty) is not DataGridFilterHost value)
     {
         value = new DataGridFilterHost(dataGrid);
         dataGrid.SetValue(FilterProperty, value);
     }
     return(value);
 }
Example #2
0
        public static DataGridFilterHost GetFilter([NotNull] this DataGrid dataGrid)
        {
            var value = (DataGridFilterHost)dataGrid.GetValue(FilterProperty);

            if (value == null)
            {
                value = new DataGridFilterHost(dataGrid);
                dataGrid.SetValue(FilterProperty, value);
            }
            return(value);
        }
        public static DataGridFilterHost GetFilter([NotNull] this DataGrid dataGrid)
        {
            Contract.Requires(dataGrid != null);
            Contract.Ensures(Contract.Result <DataGridFilterHost>() != null);

            var value = (DataGridFilterHost)dataGrid.GetValue(FilterProperty);

            if (value == null)
            {
                value = new DataGridFilterHost(dataGrid);
                dataGrid.SetValue(FilterProperty, value);
            }
            return(value);
        }
        private void self_Loaded(object sender, RoutedEventArgs e)
        {
            if (FilterHost == null)
            {
                // Find the ancestor column header and data grid controls.
                ColumnHeader = this.FindAncestorOrSelf<DataGridColumnHeader>();
                if (ColumnHeader == null)
                    throw new InvalidOperationException("DataGridFilterColumnControl must be a child element of a DataGridColumnHeader.");

                DataGrid = ColumnHeader.FindAncestorOrSelf<DataGrid>();
                if (DataGrid == null)
                    throw new InvalidOperationException("DataGridColumnHeader must be a child element of a DataGrid");

                // Find our host and attach ourself.
                FilterHost = DataGrid.GetFilter();
            }

            FilterHost.AddColumn(this);

            DataGrid.SourceUpdated += DataGrid_SourceOrTargetUpdated;
            DataGrid.TargetUpdated += DataGrid_SourceOrTargetUpdated;
            DataGrid.RowEditEnding += DataGrid_RowEditEnding;

            // Must set a non-null empty template here, else we won't get the coerce value callback when the columns attached property is null!
            Template = _emptyControlTemplate;

            // Bind our IsFilterVisible and Template properties to the corresponding properties attached to the
            // DataGridColumnHeader.Column property. Use binding instead of simple assignment since columnHeader.Column is still null at this point.
            var isFilterVisiblePropertyPath = new PropertyPath("Column.(0)", DataGridFilterColumn.IsFilterVisibleProperty);
            BindingOperations.SetBinding(this, VisibilityProperty, new Binding() { Path = isFilterVisiblePropertyPath, Source = ColumnHeader, Mode = BindingMode.OneWay, Converter = _booleanToVisibilityConverter });

            var templatePropertyPath = new PropertyPath("Column.(0)", DataGridFilterColumn.TemplateProperty);
            BindingOperations.SetBinding(this, TemplateProperty, new Binding() { Path = templatePropertyPath, Source = ColumnHeader, Mode = BindingMode.OneWay });

            var filterPropertyPath = new PropertyPath("Column.(0)", DataGridFilterColumn.FilterProperty);
            BindingOperations.SetBinding(this, FilterProperty, new Binding() { Path = filterPropertyPath, Source = ColumnHeader, Mode = BindingMode.TwoWay });
        }