Converterlogic,绑定属性的元素太多(单选按钮)

时间:2017-03-21 15:45:28

标签: c# wpf mvvm

我开始使用converterlogic来控制我的GUI的视觉输出,这是基于我的模型的属性,它从SQL填充。它似乎也产生了很多开销和代码,所以我不确定我是否以正确的方式实现了这项技术。

这是一张快照:

enter image description here

单选按钮禁用/启用某些控件,就是这样,因为属性被绑定不止一次,并且根据所选模式进行不同的解释。

所谓的模式是我的模型“Selectionmode”中的字符串属性,填充了三个值之一(四分之一,一个月,一周)。

对于三个单选按钮中的每一个,我创建了一个如下所示的valueconverter:

class IsQuarterModeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                if (value.ToString() == "Quarter")
                    return true;
            }
            return false;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return ((bool)value) ? "Quarter" : Binding.DoNothing;
        }
    }

这是我的单选按钮XAML:

<RadioButton x:Name="G_rb_quarter" Content="Aktiv" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" GroupName="rbg_auswertungszeitraum" 
                                         IsChecked="{Binding MySelectedItem.Selectionmode, Converter={StaticResource IsQuarterModeConverter}}" />

这实际上有效,并且始终将正确的值保存到我的模型中,该模型可以持久保存到数据库中供以后使用。 但实际上,每个可能的值和元素都有两个函数的类?我无法相信我这样做是正确的。

对此有何建议?

2 个答案:

答案 0 :(得分:1)

如果使用converterParameter:

,则每个值不需要转换器
public class SelectionModeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            if (value.ToString() == (string)parameter)
                return true;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((bool)value) ? parameter : Binding.DoNothing;
    }
}

并将ConverterParameter添加到绑定:

IsChecked="{Binding MySelectedItem.Selectionmode, 
                    ConverterParameter='Quater',
                    Converter={StaticResource IsQuarterModeConverter}}" 

答案 1 :(得分:1)

(至少)有两种选择。

首先,如果您想使用转换器,那么您可以使用一个相当通用的转换器,使用绑定中的ConverterParameter,看起来像这样:

public class SelectionModeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value?.ToString() == parameter.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? parameter.ToString() : Binding.DoNothing;
    }
}

您的单选按钮现在可以定义应启用选择的Selectionmode

<RadioButton IsChecked="{Binding MySelectedItem.Selectionmode,
    Converter={StaticResource SelectionModeConverter}, ConverterParameter=Quarter}" />

其他单选按钮将分别获得ConverterParameter=MonthConverterParameter=Week

或第二次,您可以将逻辑放在视图模型中,看起来像这样:

public class SelectionViewModel : INotifyPropertyChanged
{
    private string _selectionmode = null;

    public string Selectionmode
    {
        get { return _selectionmode; }
        set
        {
            if (_selectionmode == value)
                return;

            _selectionmode = value;
            OnPropertyChanged();
            OnPropertyChanged(nameof(IsQuarterSelected));
            OnPropertyChanged(nameof(IsMonthSelected));
            OnPropertyChanged(nameof(IsWeekSelected));
        }
    }

    public bool IsQuarterSelected
    {
        get { return Selectionmode == "Quarter"; }
        set { Selectionmode = value ? "Quarter" : Selectionmode; }
    }

    public bool IsMonthSelected
    {
        get { return Selectionmode == "Month"; }
        set { Selectionmode = value ? "Month" : Selectionmode; }
    }

    public bool IsWeekSelected
    {
        get { return Selectionmode == "Week"; }
        set { Selectionmode = value ? "Week" : Selectionmode; }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

单选按钮只会使用这些属性:

<RadioButton IsChecked="{Binding MySelectedItem.IsQuarterSelected}" />

我不能说在你的情况下哪两种可能的方式更好,因为这实际上取决于你的应用程序架构以及你如何实现你的MVVM框架。

在我的情况下,我可能会使用视图模型中的属性,因为我在使用MVVM时不喜欢使用很多转换器。