2015-01-10 10 views
2

Ниже приведена моя DataGrid с некоторыми прикрепленными свойствами, которые связаны с элементами управления всплывающим меню. ComboBox заполняется перечислением.Прикрепленное свойство не запускает IMultiValueConverter

<DataGrid Name="GenericDataGrid" 
       helpers:SearchBehaviours.SearchValue="{Binding ElementName=FindTextbox, Path=Text, UpdateSourceTrigger=PropertyChanged}" 
       helpers:SearchBehaviours.IsFindPopupOpen="{Binding ElementName=PopupFind, Path=IsOpen, UpdateSourceTrigger=PropertyChanged}" 
       helpers:SearchBehaviours.SearchableItems="{Binding ElementName=ComboSearchableItems, Path=SelectedValue, UpdateSourceTrigger=PropertyChanged}" > 
    </DataGrid> 

    <Popup x:Name="PopupFind"> 
     <TextBox x:Name="FindTextbox" /> 
     <ComboBox x:Name="ComboSearchableItems" 
      ItemsSource="{Binding Source={helpers:Enumeration {x:Type helpers:SearchItems}}}" 
      DisplayMemberPath="Description" 
      SelectedValue="{x:Static helpers:SearchItems.AllItems}" 
      SelectedValuePath="Value" /> 
    </Popup> 

Вот класс, который обрабатывает поведение:

class SearchBehaviours 
{ 
    // Using a DependencyProperty as the backing store for IsTextMatch. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsTextMatchProperty = 
     DependencyProperty.RegisterAttached("IsTextMatch", typeof(bool), typeof(SearchBehaviours), new UIPropertyMetadata(false)); 

    public static bool GetIsTextMatch(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsTextMatchProperty); 
    } 

    public static void SetIsTextMatch(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsTextMatchProperty, value); 
    } 

    public static readonly DependencyProperty SearchValueProperty = 
     DependencyProperty.RegisterAttached("SearchValue", typeof(string), typeof(SearchBehaviours), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.Inherits)); 

    public static string GetSearchValue(DependencyObject obj) 
    { 
     return (string)obj.GetValue(SearchValueProperty); 
    } 

    public static void SetSearchValue(DependencyObject obj, string value) 
    { 
     obj.SetValue(SearchValueProperty, value); 
    } 


    public static readonly DependencyProperty IsFindPopupOpenProperty = 
     DependencyProperty.RegisterAttached("IsFindPopupOpen", typeof(bool), typeof(SearchBehaviours), 
     new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits)); 

    public static bool GetIsFindPopupOpen(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsFindPopupOpenProperty); 
    } 

    public static void SetIsFindPopupOpen(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsFindPopupOpenProperty, value); 
    } 


    public static readonly DependencyProperty SearchableItemsProperty = 
     DependencyProperty.RegisterAttached("SearchableItems", typeof(SearchItems), typeof(SearchBehaviours), new PropertyMetadata(SearchItems.AllItems)); 

    public static SearchItems GetSearchableItems(DependencyObject obj) 
    { 
     return (SearchItems)obj.GetValue(SearchableItemsProperty); 
    } 

    public static void SetSearchableItems(DependencyObject obj, SearchItems value) 
    { 
     obj.SetValue(SearchableItemsProperty, value); 
    } 
} 

Проблема заключается в следующем IMultiValueConverter

<Style TargetType="{x:Type DataGridCell}" x:Key="textCellStyle" > 
    <Setter Property="helpers:SearchBehaviours.IsTextMatch"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource SearchValueConverter}" FallbackValue="False"> 
       <Binding Path="Content.Text" RelativeSource="{RelativeSource Self}" /> 
       <Binding Path="(helpers:SearchBehaviours.SearchValue)" RelativeSource="{RelativeSource Self}" /> 
       <Binding Path="(helpers:SearchBehaviours.IsFindPopupOpen)" RelativeSource="{RelativeSource Self}"/> 
       <Binding Path="(helpers:SearchBehaviours.SearchableItems)" RelativeSource="{RelativeSource Self}"/> 
       <Binding /> 
       <Binding RelativeSource="{x:Static RelativeSource.Self}"/> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 

    <Style.Triggers> 
     <Trigger Property="helpers:SearchBehaviours.IsTextMatch" Value="True"> 
      <Setter Property="Background" Value="DarkOrange" /> 
      <Setter Property="Foreground" Value="White"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Это вызывает IMultiValueConverter, когда всплывающее окно открыто и закрыто.
Он запускается при изменении текста текстового поля.
Однако, если SelectedValue изменяется в ComboBox, он не запускается.

Ниже представлен преобразователь, который довольно простой в настоящее время выводит при срабатывании.

public class SearchValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Console.WriteLine("Triggered"); 
     return false; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

[EDIT]

public enum SearchItems 
{ 
    [Description("All Items")] 
    AllItems, 
    [Description("Selected Items")] 
    SelectedItems 
} 

[END EDIT]

Может кто-то в чем проблема?

+0

Я не вижу определение 'свойства IsTextMatch' в' класса SearchBehaviours'. Я полагаю, это свойство bool, но ваш 'SearchValueConverter' не возвращает никакого значения в методе' Convert'. Он должен возвращать значение bool. По этой причине триггер никогда не поднимается. – user2250152

+0

Привет @ user2250152, я добавил свойство IsTextMatch, ваши были пятнами только для свойства bool. Также добавлено возвращаемое значение, это была опечатка. Добавлено также перечисление, по умолчанию для combobox установлено значение AllItems, когда я выбираю SelectedItems, я ожидаю, что конвертор будет запущен, но этого не произойдет. – Hank

+0

Вы можете попробовать поставить точку останова в методе 'SetSearchableItems', чтобы проверить, активируется ли установленный установщик свойств при изменении выбора поля со списком.Это, по крайней мере, скажет вам, работает ли привязка. –

ответ

2

Изменить DataGridCell Style код, как показано ниже:

<Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="local:SearchBehaviours.IsTextMatch"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource SearchValueConverter}" FallbackValue="False"> 
        <Binding Path="Content.Text" RelativeSource="{RelativeSource Self}" /> 
        <Binding Path="(local:SearchBehaviours.SearchValue)" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}" /> 
        <Binding Path="(local:SearchBehaviours.IsFindPopupOpen)" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}"/> 
        <Binding Path="(local:SearchBehaviours.SearchableItems)" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}"/> 
        <Binding /> 
        <Binding RelativeSource="{x:Static RelativeSource.Self}"/> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 

     <Style.Triggers> 
      <Trigger Property="local:SearchBehaviours.IsTextMatch" Value="True"> 
       <Setter Property="Background" Value="DarkOrange" /> 
       <Setter Property="Foreground" Value="White"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

Вы проходили все присоединенные свойства DataGridCell в MultiBinding конвертер, который не был assigned.In порядка, чтобы решить эту проблему, вы должны передать вложенные свойства DataGrid к MultiBindingConverter.

UPDATE :

Вы также можете использовать ComboBox так:

<ComboBox x:Name="ComboSearchableItems"/> 

& Присвоить ItemSource кодом позади, чтобы это так:

ComboSearchableItems.ItemsSource = Enum.GetValues(typeof(SearchItems)); 

Если вы хотите связать только используя XAML, а затем отправьте this link

+0

Спасибо, дайте это зайти – Hank

+0

Привет Amol, это работает в определенной степени. Однако у меня есть пара вопросов. Почему первые два свойства функционируют должным образом, а третье - нет? Другое дело, что DataGrid виртуализирован, а строки переработаны, что означает, что ячейка сбрасывает свою родословную и выдает ошибку: System.Windows.Data Warning: 4: Не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' System. Windows.Controls.DataGrid ' – Hank

+0

Я хотел сказать, что я хотел бы также сохранить рециркуляцию. – Hank

-1

Звезда с помощью инспектора WPF для изучения того, что вы связали с вашим контролем вообще.