MVVM WPF问题

时间:2009-11-12 00:11:31

标签: wpf mvvm

我正在使用MVVM模式来实现WPF应用程序。我的问题是, 我有一个是和否单选按钮和一个文本框。

例如: 你有车吗:是,否(收音机按钮) 输入型号:______________(文本框)

如果用户选择否,我将禁用它。如果用户选择“是”并将“输入模型”文本框留空,我想显示消息或更改背景(就像AdornerElement的方式一样)。我怎样才能做到这一点。

谢谢你, 重新@@收率

4 个答案:

答案 0 :(得分:1)

实际上,您不需要为此特定问题应用MVVM,因为它完全是与UI相关的事情。您可以将IsEnabled属性绑定到yesRadiobutton.IsChecked属性,以便在选择noRasioButton时禁用它。再次,您可以使用BoolToVisibilityConverter并将其绑定到TextBlock以显示消息。具有特定背景的矩形相同

答案 1 :(得分:1)

如果您不顾一切地使用MVVM,我会做的是创建一些自定义类型转换器(http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx)。

因此,在Textblock上,将文本绑定到单选按钮的IsChecked属性,然后使用转换器将该布尔值转换为您要显示的自定义字符串。

对于表单的背景,将Background元素绑定到适当的控件的IsChecked,并使用另一个类型转换器将bool转换为Color。

根据我的理解,这是如何通过MVVM实现的。

答案 2 :(得分:0)

我只会使用触发器实现此功能。当您不需要时,无需使用MVVM使事情复杂化。

答案 3 :(得分:0)

这不是MVVM模式的一部分,使用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();
    }
}