Использование коллекции объектов в качестве фильтра в RadDataFilter - PullRequest
1 голос
/ 17 октября 2011

У меня есть приложение Silverlight, в котором я использую RadDataFilter. Этот RadDataFilter использует список пользовательских объектов в качестве источника данных для testComboBox. Когда пользователь нажимает кнопку «Тест», значение фильтра всегда устанавливается на «Unset». Например, если я использую код ниже, я всегда вижу «Приоритет IsEqualTo». Однако, если я использую список строковых значений в качестве источника данных для testComboBox, все работает нормально. Вот мой код:

<UserControl.Resources>
  <DataTemplate x:Key="priorityTemplate">
    <telerik:RadComboBox x:Name="testComboBox" MinWidth="100" DisplayMemberPath="Title" SelectedValue="{Binding Path=Value, Mode=TwoWay, FallbackValue=null}" SelectionChanged="testComboBox_SelectionChanged">
                <telerik:RadComboBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel MinWidth="320" />
                    </ItemsPanelTemplate>
                </telerik:RadComboBox.ItemsPanel>               
            </telerik:RadComboBox>
        </DataTemplate>

        <DataTemplate x:Key="locationTemplate"></DataTemplate>

        <DataTemplate x:Key="typeTemplate"></DataTemplate>

        <code:MyEditorTemplateSelector x:Key="myEditorTemplate">
            <code:MyEditorTemplateSelector.EditorTemplateRules>
                <code:MyEditorTemplateRule PropertyName="Priority" DataTemplate="{StaticResource priorityTemplate}" />
                <code:MyEditorTemplateRule PropertyName="Location" DataTemplate="{StaticResource locationTemplate}" />
                <code:MyEditorTemplateRule PropertyName="TypeName" DataTemplate="{StaticResource typeTemplate}" />               
            </code:MyEditorTemplateSelector.EditorTemplateRules>
           </code:MyEditorTemplateSelector>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>

        <Button Content="Test" Height="30" Width="90" Margin="0,0,0,8" HorizontalAlignment="Left" Click="Button_Click" />
        <telerik:RadDataFilter x:Name="filter" Grid.Row="1" EditorCreated="filter_EditorCreated" AutoGenerateItemPropertyDefinitions="False" EditorTemplateSelector="{StaticResource myEditorTemplate}" Loaded="filter_Loaded" />
    </Grid>

Вот соответствующие части моего кода:

private void filter_Loaded(object sender, RoutedEventArgs e)
{
    ItemPropertyDefinition priorityDefinition = new ItemPropertyDefinition("Priority", typeof(string), "Priority");
    filter.ItemPropertyDefinitions.Add(priorityDefinition);
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    string rules = string.Empty;
    foreach (FilterDescriptor description in filter.FilterDescriptors)
        rules += description.ToString() + "\n";
    MessageBox.Show(rules);
}

private void filter_EditorCreated(object sender, EditorCreatedEventArgs e)
{
    switch (e.ItemPropertyDefinition.PropertyName)
    {
        case "Priority":
            // This works
            List<string> options = new List<string>() { "High", "Low" };
            //(RadComboBox)(e.Editor)).ItemsSource = options;

            // This doesn't
            List<Priority> priorities = new List<Priority>();
            priorities.Add(new Priority("High", true));
            priorities.Add(new Priority("Low", false));
            ((RadComboBox)(e.Editor)).ItemsSource = priorities;

            break;
    }
}

Вот определение для Priority.cs:

public class Priority
{
    public string Title { get; set; }

    public bool Val { get; set; }

    public Priority(string title, bool val)
    {
        this.Title = title;
        this.Val = val;
    }
}

Наконец, вот код выбора шаблона:

public class MyEditorTemplateSelector : DataTemplateSelector
{
    private List<MyEditorTemplateRule> templateRules = new List<MyEditorTemplateRule>();
    public List<MyEditorTemplateRule> EditorTemplateRules
    {
        get { return templateRules; }
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        ItemPropertyDefinition propertyDefinition = (ItemPropertyDefinition)item;
        foreach (MyEditorTemplateRule rule in templateRules)
        {
            // Select the appropriate template for each property.
            if (rule.PropertyName == propertyDefinition.PropertyName)
            {
                return rule.DataTemplate;
            }
        }
        return base.SelectTemplate(item, container);
    }
}

public class MyEditorTemplateRule
{
    private string propertyName;
    public string PropertyName
    {
        get
        {
            return this.propertyName;
        }
        set
        {
            this.propertyName = value;
        }
    }

    private DataTemplate dataTemplate;
    public DataTemplate DataTemplate
    {
        get
        {
            return this.dataTemplate;
        }
        set
        {
            this.dataTemplate = value;
        }
    }
}

Как использовать пользовательский тип для параметров фильтра в шаблоне редактора?

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

На самом деле, я думаю, что когда вы используете список строк, вы используете следующий код:

<telerik:RadComboBox x:Name="testComboBox" MinWidth="100" DisplayMemberPath="Title"
SelectedValue="{Binding Path=Value, Mode=TwoWay, FallbackValue=null}"
SelectionChanged="testComboBox_SelectionChanged">

Но когда вы меняете, например, DataSource, вы используете коллекцию объектов, то вы, вероятно, меняетеDisplayMemberPath и SelectedValue.Для DadDataFilter вы не должны изменять

 selectValue={Binding Path=Value, Mode=TwoWay, FallbackValue=null};

Здесь path=Value должно быть одинаковым для всех привязок.Попробуйте использовать следующее:

<telerik:RadComboBox x:Name="testComboBox" MinWidth="100" DisplayMemberPath="Title"
SelectedValue="{Binding Value, Mode=TwoWay, FallbackValue=null}"
SelectionChanged="testComboBox_SelectionChanged">
0 голосов
/ 05 апреля 2012

У меня была точно такая же проблема в WPF, я нашел твой вопрос, в то время как гуглил напрасно решение, которое я наконец-то нашел:

Вы устанавливаете тип свойства вашего ItemPropertyDefinition в строку, но впривязка вашего RadComboBox SelectedValue, значение привязанного объекта имеет тип «Приоритет».Таким образом, решение состоит в том, чтобы использовать объект Converter в вашей привязке, класс Converter должен реализовывать IValueConverter.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Data;
using QUPS.Data;
using QUPS.Data.QUPSModel;

namespace QUPS.Helpers
{
    public class EntityObjectToDecimalConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter,
                              CultureInfo culture)
        {
            if (value is IQUPSEntityObject)
            {
                var rec = (IQUPSEntityObject)value;
                return rec.ID;
            }

            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter,
                                  CultureInfo culture)
        {
            if (value is IQUPSEntityObject)
            {
                var rec = (IQUPSEntityObject)value;
                return rec.ID;
            }

            return value;
        }
    }
}

И вот часть моего xaml:

<DataTemplate x:Key="CriteriaRightExpressionComboBoxTemplate">
    <telerik:RadComboBox SelectedValue="{Binding Value, Mode=OneWayToSource, FallbackValue=null, Converter={StaticResource EntityObjectToDecimalConverter}}"
                             MinWidth="100"
                             ItemTemplateSelector="{StaticResource CriteriaRightExpressionComboBoxTemplateSelector}"
                             >
    </telerik:RadComboBox>
</DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...