Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Converterlogic,绑定属性元素太多(单选按钮)_C#_Wpf_Mvvm - Fatal编程技术网

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

C# Converterlogic,绑定属性元素太多(单选按钮),c#,wpf,mvvm,C#,Wpf,Mvvm,我开始使用converterlogic根据模型的属性来控制GUI的可视输出,该属性由SQL填充。它似乎会产生大量的开销和代码,因此我不确定我是否以正确的方式实现了该技术 下面是一个快照: 单选按钮禁用/启用某些控件,这是因为属性绑定了多次,并且根据所选模式进行不同的解释 所谓的模式是我的模型“Selectionmode”中的字符串属性,由三个值(季度、月、周)中的一个填充 对于三个单选按钮中的每一个,我都创建了一个valueconverter,如下所示: class IsQuarterMode

我开始使用converterlogic根据模型的属性来控制GUI的可视输出,该属性由SQL填充。它似乎会产生大量的开销和代码,因此我不确定我是否以正确的方式实现了该技术

下面是一个快照:

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

所谓的模式是我的模型“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}}" />

这实际上是可行的,并且总是将正确的值保存到我的模型中,可以保存到数据库中供以后使用。 但实际上,一个类对于每个可能的值和元素都有两个函数?我不敢相信我这样做是对的


对此有何建议?

如果使用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}}" 
有(至少)两种选择

首先,如果您想使用转换器,那么您可以使用一个相当通用的转换器,它使用绑定中的
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;
    }
}
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));
}
您的单选按钮现在可以定义应启用选择的
Selectionmode

<RadioButton IsChecked="{Binding MySelectedItem.Selectionmode,
    Converter={StaticResource SelectionModeConverter}, ConverterParameter=Quarter}" />
单选按钮将仅使用以下属性:

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

我不能说这两种可能的方法中哪一种更好,因为这实际上取决于您的应用程序体系结构以及您如何实现MVVM框架


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

另一个答案更详细,所以我将其标记为供未来读者使用的答案,但我很荣幸您提到了相同的解决方案(:您好,感谢您提供了非常详细的答案,您甚至还指出了解决此问题的另一种方法。我想我会用converterparameters将我的converterlogic修改为更通用的方法-我想这就是我实际搜索的内容。@kurdy很高兴我能帮助您!:-)