我开始使用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}}" />
这实际上有效,并且始终将正确的值保存到我的模型中,该模型可以持久保存到数据库中供以后使用。 但实际上,每个可能的值和元素都有两个函数的类?我无法相信我这样做是正确的。
对此有何建议?
答案 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=Month
和ConverterParameter=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时不喜欢使用很多转换器。