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