2015-01-28 4 views
2

В моем проекте у меня в настоящее время есть ObservableCollection, который заполняется внутри моего конструктора ViewModel. Этот ObservableCollection содержит пользовательский объект, который имеет два свойства (обе строки).Фильтрация ObservableCollection для множества списков

В настоящее время экземпляр XAML/View имеет два отдельных списка, оба из которых связаны с DataTemplate, который выбирает, какое свойство будет отображаться как запись в ListBox. В этом случае отображается «propertyOne».

Возможно ли иметь DataTemplate, который может выбрать, где каждый ListBox -item идет в зависимости от содержания 'propertyTwo'?

Я рассмотрел примеры, подобные моей ситуации, которые использовали CollectionViewSource, но я не слишком уверен в том, как реализовать это в своем проекте, поскольку я довольно новичок в использовании WPF и после структуры MVVM. Будет ли это связано с созданием события фильтра в коде для представления?

Ниже перечислены фрагменты моего кода, которые, я думаю, были бы полезны при понимании моего вопроса. Любая помощь в решении этого вопроса будет очень оценена.

Посмотреть

<Window.Resources> 
    <DataTemplate x:Key="ListBoxTemplate"> 
     <StackPanel> 
      <TextBlock Text="{Binding Path=propertyOne}" /> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

<ListBox x:Name="ListBoxOne" 
     Height="Auto" 
     Width="Auto" 
     ItemsSource="{Binding TestCollection}" 
     ItemTemplate="{StaticResource ListBoxTemplate}" /> 

<ListBox x:Name="ListBoxTwo" 
     Height="Auto" 
     Width="Auto" 
     ItemsSource="{Binding TestCollection}" 
     ItemTemplate="{StaticResource ListBoxTemplate}" />  

ViewModel

public class ViewModel 
{ 
    public ObservableCollection<Item> TestCollection { get; set; } 

    public ViewModel() 
    { 
     //populates the collection from an XML file 
     //with propertyOne & propertyTwo for each item 

     TestCollection = CustomObjectClass.DeserializeToColl<Item>("path"); 
    } 
} 

CustomObjectClass

public class CustomObjectClass 
{ 
    public string propertyOne { get; set; } 
    public string propertyTwo { get; set; } 
} 
+0

Убедившись я получил ваш вопрос - вы хотите второй 'ListBox' показать propertyTwo? –

+0

Думаете, вам нужно перефразировать вопрос. Возможно, даже добавив пример с желаемым выходом. –

+0

№. В списках по-прежнему отображается свойствоOne, но это свойствоTwo, которое решает, к какому «ListBox» он идет. , например. если пользовательский объект имеет строку «read», установленную как «свойствоTwo», этот объект (с его именем propertyOne, отображаемым в «ListBox»), отправляется в «ListBoxTwo». – sunnysesh

ответ

1
<DataTemplate x:Key="ListBoxTemplate"> 
     <StackPanel> 
      <StackPanel.Style> 
       <Style> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=propertyTwo}" Value="read"> 
          <Setter Property="StackPanel.Visibility" Value="Collapsed"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </StackPanel.Style> 
      <TextBlock Text="{Binding Path=propertyOne}" /> 
     </StackPanel> 
    </DataTemplate> 
+0

добавить еще один шаблон для второго списка, подобного этому, и обменять значение в datatrigger –

+0

Пробовал это и, похоже, сработал. Из того, что я понимаю, это в основном скроет значение, указанное рядом с 'Value ='. – sunnysesh

+0

Если вы хотите использовать multiselect, хотя это будет сложно ... –

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