У меня проблема с привязкой текстового поля в 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>
Я думаю, мне не хватает точного способа привязки текстового поля в заголовке к свойству.
Решил проблему, но ничего не помогло, поэтому далеко!
Спасибо за любые предложения!