wpfmvvmcaliburn

WPF MVVM Caliburn Datagrid Filter in Header doesnt fire propertycahnged


I've got a problem binding a textbox within a datagridheader to a property of my viewmodel.

Once I put a texbox to the view and bind this one to the property everything is fine but in the header of the column it doesnt realize the property changed event.

Tried to figure out whats the problem here but didnt get any further with it.

MyViewModel:

Dictionary<string, Predicate<UIOrderModel>> filters
    = new Dictionary<string, Predicate<UIOrderModel>>();

    private string parentId;
    private List<Predicate<UIOrderModel>> criteria = new List<Predicate<UIOrderModel>>();
    private ICollectionView orders;
    private IEventAggregator events;
    private UIOrderModel selItem;

    public OrderSumUpViewModel() {
        Orders = (CollectionView)CollectionViewSource.GetDefaultView(new UIAllOrdersModel().GetAll());
    }

    public ICollectionView Orders
    {
        get
        {
            return this.orders;
        }

        set
        {
            this.orders = value;
            NotifyOfPropertyChange(() => Orders);
        }
    }

    private string codeSearchStr;
    public string CodeSearchStr 
    {
        get { return this.codeSearchStr; }
        set
        {
            this.codeSearchStr = value;
            NotifyOfPropertyChange(() => CodeSearchStr);
            MessageBox.Show("fired");
            FireFilter();
        } 
    }

    private bool dynamic_Filter(object obj) {
        UIOrderModel ord = obj as UIOrderModel;
        bool isIn = true;
        if (criteria.Count() == 0)
            return isIn;
        isIn = criteria.TrueForAll(x => x(ord));
        return isIn;
    }

    private void FireFilter() {
        criteria.Clear();

        if (!String.IsNullOrWhiteSpace(CodeSearchStr)) {
            int i = 0;

            if(int.TryParse(CodeSearchStr, out i)) {
                i = int.Parse(CodeSearchStr);
            }

            criteria.Add(new Predicate<UIOrderModel>(x => x.Code == i));
        }

        //if (!String.IsNullOrWhiteSpace(ItemCodeSearchStr)) {
        //    criteria.Add(new Predicate<UIitemModel>(x => x.ItemCode.ToLower().Contains(ItemCodeSearchStr.ToLower())));
        //}

        //if (!String.IsNullOrWhiteSpace(ItemTypeSearchStr)) {
        //    criteria.Add(new Predicate<UIitemModel>(x => x.Type.ToLower().Contains(ItemTypeSearchStr.ToLower())));
        //}

        //if (!String.IsNullOrWhiteSpace(ItemDrawingNoSearchStr)) {
        //    criteria.Add(new Predicate<UIitemModel>(x => x.DrawingNo.ToLower().Contains(ItemDrawingNoSearchStr.ToLower())));
        //}

        Orders.Filter = dynamic_Filter;
        Orders.Refresh();
    }
}

And the XAML:

<UserControl x:Class="MKDesktopUI.Views.OrderSumUpView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:MKDesktopUI.Views"
         mc:Ignorable="d" Background="White"
         d:DesignHeight="500" d:DesignWidth="800">
<UserControl.Resources>
    <Style TargetType="{x:Type DataGridRow}">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
        </Style.Resources>
    </Style>
</UserControl.Resources>
<Grid>
    <Grid.ColumnDefinitions>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>

    <Border Grid.Row="0" Background="#FF474A57" />

    <!-- MainGrid Row 0-->
    <TextBlock Grid.Row="0"
               Foreground="White"
               HorizontalAlignment="Center" 
               FontSize="24" Margin="5">
        Auftragserfassung
    </TextBlock>

    <!--<TextBox Margin="30,30,0,0" Grid.ColumnSpan="2" Grid.Row="1" x:Name="CodeSearchStr" Width="50" HorizontalAlignment="Left"></TextBox>-->
    
    <DataGrid     Grid.Row="2" Grid.ColumnSpan="2" x:Name="Auftragsliste" AutoGenerateColumns="False"
                  CanUserAddRows="false" ItemsSource="{Binding Orders}"
                  SelectionMode="Single"
                  IsSynchronizedWithCurrentItem="True"
                  Margin="0,30,0,0" 
                  Width="780"
                  MaxHeight="500"
                  HorizontalAlignment="Center" 
                  VerticalAlignment="Center" 
                  GridLinesVisibility="Horizontal" OpacityMask="#FF72C4D6">

        <DataGrid.Columns>
            <DataGridTextColumn Header="Code"
                                    Binding="{Binding Code}" 
                                    Width="Auto">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <TextBlock TextAlignment="Center">Code</TextBlock>
                            <TextBox MinWidth="50"  
                                     Text="{Binding CodeSearchStr,
                                            Mode=TwoWay,
                                            UpdateSourceTrigger=PropertyChanged}"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
            <DataGridTextColumn Header="OrderDate"
                                    Binding="{Binding OrderDate,StringFormat='{}{0:dd.MM.yyyy}'}" 
                                    Width="Auto">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <TextBlock TextAlignment="Center">Auftragsdat</TextBlock>
                            <TextBox MinWidth="50"  />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
            <DataGridTextColumn Header="OrderedByEmp"
                                    Binding="{Binding OrderedByEmpPersId}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="ForDepartment" 
                                    Binding="{Binding DepartmentName}" 
                                    Width="Auto"/>
            
            <DataGridTextColumn Header="Benötigt bis"
                                    Binding="{Binding ExpectedFinishDate,StringFormat='{}{0:dd.MM.yyyy}'}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Menge"
                                    Binding="{Binding Quantity}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Einheit"
                                    Binding="{Binding Unit}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Artikelnr."
                                    Binding="{Binding ItemCode}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Artikelbezeichnung"
                                    Binding="{Binding ItemName}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Zusatztext"
                                    Binding="{Binding Additions}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Project"
                                    Binding="{Binding Project}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Kd.Auftrag"
                                    Binding="{Binding Commission}" 
                                    Width="Auto"/>
            <DataGridTextColumn Header="Status"
                                    Binding="{Binding StatusFlag}" 
                                    Width="Auto"/>

        </DataGrid.Columns>
    </DataGrid>
</Grid>

I guess I'm missing the exact way to bind the textbox within the header to the property.

Gave the problem a bunch of tries but nothing helped so far!

Thanks for any sugestions!


Solution

  • Finally figured how to handle that issue.

    This worked for me and is finally firing the propertychanged event:

    <TextBox x:Name="CodeSearchStr" MinWidth="50"  
                                         Text="{Binding DataContext.CodeSearchStr,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, UpdateSourceTrigger=PropertyChanged}"/>