Header 中的 WPF MVVM Caliburn Datagrid 过滤器不会触发 propertychanged

WPF MVVM Caliburn Datagrid Filter in Header doesnt fire propertycahnged

我在将数据网格header 中的文本框绑定到我的视图模型的 属性 时遇到问题。

一旦我将一个 texbox 放到视图中并将这个文本框绑定到 属性 一切都很好但是在列的 header 中它没有意识到 属性 已更改事件。

试图弄清楚这里的问题是什么,但没有得到任何进一步的解决。

我的视图模型:

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

和 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>

我想我错过了将 header 中的文本框绑定到 属性 的确切方法。

对问题进行了多次尝试,但到目前为止没有任何帮助!

感谢您的任何建议!

终于想出了如何处理这个问题。

这对我有用,最终触发了 propertychanged 事件:

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