【发布时间】:2010-12-15 16:40:47
【问题描述】:
我正在使用 MVVM 模式来实现 WPF 应用程序。我的问题是, 我有一个是和否单选按钮和一个文本框。
例如: 您是否拥有汽车:是,否(单选按钮) 输入型号:______________(文本框)
如果用户选择否,我将禁用它。如果用户选择“是”并将“输入模型”文本框留空,我想显示一条消息或更改背景(就像 AdornerElement 所做的那样)。我怎样才能做到这一点。
谢谢你, 回复@@y。
【问题讨论】:
我正在使用 MVVM 模式来实现 WPF 应用程序。我的问题是, 我有一个是和否单选按钮和一个文本框。
例如: 您是否拥有汽车:是,否(单选按钮) 输入型号:______________(文本框)
如果用户选择否,我将禁用它。如果用户选择“是”并将“输入模型”文本框留空,我想显示一条消息或更改背景(就像 AdornerElement 所做的那样)。我怎样才能做到这一点。
谢谢你, 回复@@y。
【问题讨论】:
这不是 MVVM Pattern 的一部分,使用 WPF 触发器如下,背景颜色使用转换器`
<Window.Resources>
<conv:BackgroundConverter x:Key="backgroundConverter"/>
<Style TargetType="{x:Type TextBox}" x:Key="ModelBoxStyle">
<Setter Property="IsEnabled" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=NoOption,Path=IsChecked}" Value="True" >
<Setter Property="IsEnabled" Value="False"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid Background="{Binding Text,ElementName=ModelBox,Converter={StaticResource backgroundConverter}}">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<RadioButton Content="Yes" x:Name="YesOption" Grid.Column="0"/>
<RadioButton Content="No" x:Name="NoOption" Grid.Column="2"/>
<TextBlock Text="Enter Model :" Grid.Row="1" Grid.Column="0"/>
<TextBox x:Name="ModelBox" MinWidth="100" Height="20" Grid.Row="1" Grid.Column="2" Style="{StaticResource ModelBoxStyle}"
HorizontalAlignment="Center" VerticalAlignment="Top"/>
</Grid>
public class BackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string text = value as string;
if (string.IsNullOrEmpty(text))
{
return Brushes.Red;
}
return Brushes.White;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
【讨论】:
我将仅使用触发器来实现这一点。当您不需要时,无需使用 MVVM 使事情复杂化。
【讨论】:
如果您急需使用 MVVM,我会做的是创建一些自定义类型转换器 (http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx)。
因此,在文本块上,将文本绑定到单选按钮的 IsChecked 属性,然后使用转换器将该布尔值转换为您要显示的自定义字符串。
对于表单的背景,将 Background 元素绑定到相应控件的 IsChecked 并使用另一个类型转换器将 bool 转换为 Color。
据我了解,这就是如何通过 MVVM 来实现的。
【讨论】:
实际上你不需要为这个特定的问题应用 MVVM,因为它完全是一个与 UI 相关的东西。您可以将 IsEnabled 属性绑定到 yesRadiobutton.IsChecked 属性,以在您选择 noRasioButton 时将其禁用。再次,您可以使用 BoolToVisibilityConverter 并将其绑定到 TextBlock 以显示消息。对于具有特定背景的矩形也是如此
【讨论】: