MVVM WPF Вопрос - PullRequest
       15

MVVM WPF Вопрос

2 голосов
/ 12 ноября 2009

Я использую шаблон MVVM для реализации приложения WPF. Мой вопрос У меня есть радио кнопки «Да» и «Нет» и текстовое поле.

например: Есть ли у вас автомобиль: да, нет (радио кнопки) Введите модель: ______________ (текстовое поле)

если пользователь выбирает Нет, я отключаю его. если пользователь выбирает «Да» и оставляет текстовое поле «Введите модель» пустым, я хочу отобразить сообщение или изменить фон (как это делает AdornerElement) Как мне этого добиться.

Спасибо, Re @@ у.

Ответы [ 4 ]

1 голос
/ 12 ноября 2009

Что бы я сделал, если бы вы отчаянно пытались использовать MVVM, это создать несколько пользовательских преобразователей типов (http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx).

Итак, в текстовом блоке свяжите текст со свойством IsChecked переключателей, а затем с помощью конвертера переведите это логическое значение в пользовательскую строку, которую вы хотите отобразить.

Для фона формы свяжите элемент Background с IsChecked соответствующего элемента управления и используйте другой конвертер типов для преобразования из bool в Color.

Вот, в моем понимании, как это сделать через MVVM.

1 голос
/ 12 ноября 2009

На самом деле вам не нужно применять MVVM для этой конкретной проблемы, так как это полностью связано с пользовательским интерфейсом. Вы можете привязать свойство IsEnabled к свойству yesRadiobutton.IsChecked, чтобы отключить его при выборе noRasioButton. И снова, вы можете использовать BoolToVisibilityConverter и привязать его к TextBlock для отображения сообщения. То же самое для прямоугольника с определенным фоном

0 голосов
/ 16 февраля 2017

Это не часть шаблона 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();
    }
}
0 голосов
/ 17 ноября 2009

Я бы реализовал это, используя только триггеры. Не нужно усложнять вещи с помощью MVVM, когда вам это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...