WPF MVVM Caliburn Datagrid Filter в заголовке не запускает propertycahnged - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема с привязкой текстового поля в datagridheader к свойству моей модели просмотра.

Как только я помещаю текстовое поле в представление и привязываю его к свойству, все в порядке, но в заголовке столбца он не осознает событие изменения свойства.

Пытался выяснить, в чем проблема, но дальше не нашел.

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

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

Я думаю, мне не хватает точного способа привязки текстового поля в заголовке к свойству.

Решил проблему, но ничего не помогло, поэтому далеко!

Спасибо за любые предложения!

1 Ответ

0 голосов
/ 15 июля 2020

Наконец-то выяснилось, как справиться с этой проблемой.

Это сработало для меня и, наконец, запускает событие propertychanged:

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