【问题标题】:MVVM WPF QuestionMVVM WPF 问题
【发布时间】:2010-12-15 16:40:47
【问题描述】:

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

例如: 您是否拥有汽车:是,否(单选按钮) 输入型号:______________(文本框)

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

谢谢你, 回复@@y。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    这不是 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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      我将仅使用触发器来实现这一点。当您不需要时,无需使用 MVVM 使事情复杂化。

      【讨论】:

        【解决方案3】:

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

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

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

        据我了解,这就是如何通过 MVVM 来实现的。

        【讨论】:

        • 这也是我上面提出的,它不是真正的 MVVM,它纯粹是 XAML 工作,所以我们的解决方案不需要 C# 代码或 ViewModel。
        • Jobi Joy:您有代码示例吗?我是 MVVM 的新手,需要学习很多示例。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          • 2011-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多