2014-11-26 3 views
0

Я здесь с новой проблемой.Связывание свойства внутри CollectionViewSource с собственностью ViewModel

У меня есть DataGrid и текстовое поле. Я хотел бы отфильтровать DataGrid на основе значения TextBox.

Я это сделал используя MarkupExtensions как упомянуто here.

Теперь он отлично работает до свойства Value (свойство класса PropertyFilter, как указано в ссылке выше) представляет собой строку, указанную в XAML. Когда я меняю его на привязку, он перестает работать. Вот моя XAML с обязательным:

<CollectionViewSource x:Key="GroupsViewSource" Source="{Binding Groups}"> 
    <CollectionViewSource.Filter> 
     <me:Filter> 
      <me:PropertyFilter PropertyName="GroupName" 
           Value="{Binding SearchGroupName}" /> 
     </me:Filter> 
    </CollectionViewSource.Filter> 
</CollectionViewSource> 

SearchGroupName простое свойство типа строки в моем ViewModel.

Я также попытался изменить связывание следующим образом:

Value = "{Binding DataContext.SearchGroupName, RelativeSource={RelativeSource 
           Mode=FindAncestor, AncestorType={x:Type UserControl}}}" 

Я пытался отладить ее, используя System.Diagnostics следующим образом:

<CollectionViewSource x:Key="GroupsViewSource" Source="{Binding Groups}"> 
    <CollectionViewSource.Filter> 
     <me:Filter> 
      <me:PropertyFilter PropertyName="GroupName" 
           Value="{Binding SearchGroupName, diag:PresentationTraceSources.TraceLevel=High}" /> 
     </me:Filter> 
    </CollectionViewSource.Filter> 
</CollectionViewSource> 

Но тогда я получаю ошибку компиляции: неизвестное свойство PresentationTraceSources.TraceLevel для System.Windows.Data.Binding ......

Я думаю, что моя привязка к RelativeSource не работает, потому что я думаю, что Co llectionViewSource не является членом Visual/Logical Tree.

Таким образом, я думаю, что мой DataContext может быть нулевым. Какие решения вы предпочитаете, если находитесь в одной и той же ситуации ?????

ответ

1

Вы можете попробовать переместить фильтр в ресурсы элемента рамки с правильным DataContext, используя привязку, такую ​​как Path=DataContext.<property-name>, Source={x:Reference <element-name>}. Укажите фильтр, где он вам нужен, используя StaticResource.

Это обходное решение полезно, например, для binding in collection containers.


Кодекс должен быть чем-то вроде этого (непроверенные):

<SomeElement Name="el"> 
    <SomeElement.Resources> 
     <me:PropertyFilter x:Key="Filter1" PropertyName="GroupName" 
          Value="{Binding DataContext.SearchGroupName, Source={x:Reference el}}" /> 
     <CollectionViewSource x:Key="GroupsViewSource" Source="{Binding Groups}"> 
      <CollectionViewSource.Filter> 
       <me:Filter> 
        <StaticResource ResourceKey="Filter1"/> 
       </me:Filter> 
      </CollectionViewSource.Filter> 
     </CollectionViewSource> 
+0

Я использовал 'х: Reference', как вы предложили. Теперь мое привязка правильное, когда я положил ValueConverter и поставил в нем точку останова, он показывает ожидаемое значение. Но dataGrid не фильтруется, когда я пишу что-либо в текстовом поле. Я также изменил UpdateSourceTrigger на PropoertyChanged. Но когда я нажимаю на заголовок столбца DataGrid, фильтр работает. – Vishal

+0

Невозможно, чтобы «CollectionViewSource» знал, что результаты метода фильтра фильтра изменены, вам нужно как-то его обновить. Не знаю, как это можно сделать, хотя ... –

+0

Спасибо. Тогда мне придется найти другой подход для фильтрации данных. – Vishal

Смежные вопросы