想要在动态生成的列中为布尔值显示“是”/“否”,而不是在RadGridView for WPF中显示复选框

时间:2016-02-23 18:37:17

标签: wpf silverlight telerik radgridview

我希望在收到布尔类型数据(它可以接收不同类型的数据)时显示“是”或“否”,以便在RadGridView中生成列而不是复选框。我想在xaml中实现这一变化。列正在动态生成。这是它现在的创建方式:

 <telerik:RadGridView x:Name="Data" Grid.Row="3" Margin="5" AutoGenerateColumns="False" CanUserSortColumns="True" IsFilteringAllowed="True"
                                 grid:RadGridViewColumnsBinding.ColumnsCollection="{Binding Path=ColumnsData}"
                                 IsReadOnly="False" CanUserResizeColumns="True"/>

我是Silverlight编码的新手。如果有人可以提供帮助,我们将非常感激。

1 个答案:

答案 0 :(得分:1)

您应该查看Telerik在此demo中拥有的ConditionalDataTemplateSelector,如果您还没有,请阅读IValueConverter

根据您尝试对所有列执行的操作,ConditionalDataTemplateSelector可能过度,但您可以使用它来为基于自定义规则系统的给定单元格的DataTemplate创建规则系统。

<Grid.Resources>
    ...
    <DataTemplate x:Key="CellDisplayTextBox">
        <TextBlock Text="{Binding Value, Converter={StaticResource BooleanToYesNoConverter}}" />
    </DataTemplate>

    <selector:ConditionalDataTemplateSelector x:Key="displaySelector" ConditionConverter="{StaticResource someConverter}">
        <selector:ConditionalDataTemplateSelector.Rules>
            <selector:ConditionalDataTemplateRule DataTemplate="{StaticResource CellDisplayTextBox}">
                <selector:ConditionalDataTemplateRule.Value>
                    <sys:Int32>1</sys:Int32> <!--You need to figure out what value and type to use here -->
                </selector:ConditionalDataTemplateRule.Value>
            </selector:ConditionalDataTemplateRule>
            ...
    </selector:ConditionalDataTemplateSelector.Rules>
</Grid.Resources>
...
<telerikGridView:RadGridView>
    <telerik:RadGridView.Columns>
        <telerik:GridViewDataColumn CellTemplateSelector="{StaticResource displaySelector}" CellEditTemplateSelector="{StaticResource editSelector}" />
    </telerik:RadGridView.Columns>
</telerikGridView:RadGridView>

IValueConverter将允许您绑定bool值,但显示字符串值。对于BooleanToYesNoConverter,您可以执行以下操作:

public class BooleanToYesNoConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool? bValue = value as bool?;

        if (bValue.HasValue)
            return bValue.Value ? "Yes" : "No";
        else
            return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string sValue = value as string;
        return sValue == "Yes";
    }
}

演示中的ConditionalDataTemplateSelector代码:

public class ConditionalDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        object conditionValue = this.ConditionConverter.Convert(item, null, null, null);
        foreach (ConditionalDataTemplateRule rule in this.Rules)
        {
            if (Equals(rule.Value, conditionValue))
            {
                return rule.DataTemplate;
            }
        }

        return base.SelectTemplate(item, container);
    }

    List<ConditionalDataTemplateRule> _Rules;
    public List<ConditionalDataTemplateRule> Rules 
    {
        get
        {
            if (this._Rules == null)
            {
                this._Rules = new List<ConditionalDataTemplateRule>();
            }

            return this._Rules;
        }
    }

    IValueConverter _ConditionConverter;
    public IValueConverter ConditionConverter
    {
        get
        {
            return this._ConditionConverter;
        }
        set
        {
            this._ConditionConverter = value;
        }
    }
}

public class ConditionalDataTemplateRule
{
    object _Value;
    public object Value
    {
        get
        {
            return this._Value;
        }
        set
        {
            this._Value = value;
        }
    }

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