Не удается сделать элементы управления видимыми и скрытыми в окне в WPF с помощью viewmodel? - PullRequest
4 голосов
/ 12 июля 2011

Я реализовал текстовое поле, и оно должно становиться видимым, когда флажок не установлен, и наоборот. Вот мой взгляд:

 <TextBox Visibility="{Binding VisiMaxTime}" Height="23" HorizontalAlignment="Left" Margin="165,36,0,0" Text="{Binding Path=MaxTime,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" VerticalAlignment="Top" Width="75" />
 <CheckBox IsChecked="{Binding MaxTimeIsChecked}" Content="Geen" FontWeight="Bold" Height="16" HorizontalAlignment="Left" Margin="104,39,0,0" Name="checkBox1" VerticalAlignment="Top" />

А это моя модель:

public bool MaxTimeIsChecked
        {
            get { return maxTimeIsChecked; }
            set
            {
                maxTimeIsChecked = value;
                if (maxTimeIsChecked == true)
                {
                    VisiMaxTime = Visibility.Hidden;
                    this.Examination.MaxTime = 0;
                }

                else
                VisiMaxTime = Visibility.Visible;
                OnPropertyChanged("MaxTimeIsChecked");
            }
        }



private Visibility visiMaxTime;
        public Visibility VisiMaxTime
        {
            get { return visiMaxTime; }
            set
            {
                visiMaxTime = value;
                OnPropertyChanged("VisiMaxTime");
            }
        }    

Так что я думаю, что это хорошо, это работает в usercontrols, но сейчас я работаю в окне. Если я устанавливаю точку останова в установщиках видимости, она работает нормально, но текстовое поле просто не становится видимым? Кто-нибудь знает, что я делаю не так?

Спасибо

Ответы [ 4 ]

4 голосов
/ 12 июля 2011

, если видимость текстового поля зависит от флажка, почему бы не привязать к нему напрямую?

 <TextBox Visibility="{Binding ElementName=checkBox1,Path=IsChecked,Converter=BooleanToVisibilityConverter}" />

вам нужно будет использовать BooleanToVisibilityConverter для преобразования Bool в Visiblity

0 голосов
/ 12 июля 2011

Проблема в том, что свойство VisiMaxTime не обновляет свойство MaxTimeIsChecked

private Visibility visiMaxTime;         
public Visibility VisiMaxTime         
{             
           get { return visiMaxTime; }             
           set             
           {   
                if (visiMaxTime == value)
                    return;           
                visiMaxTime = value;                 
                OnPropertyChanged("VisiMaxTime");   
                MaxTimeIsChecked = VisiMaxTime == Visibility.Visible;          
            }        
 } 

При этом вы можете просто привязать свойство MaxTimeIsChecked и использовать BooleanToVisibilityConverter

0 голосов
/ 12 июля 2011

Является ли DataContext вашего TextBox правильным?

Я заметил, что ваше свойство MaxTime определено в вашем ViewModel как ExaminationTime.MaxTime, а привязка TextBox.Text связана с MaxTime.DataContext вашего TextBox ваш ViewModel или ExaminationTime?

0 голосов
/ 12 июля 2011

Я полагаю, вам нужно двустороннее связывание:

<CheckBox IsChecked="{Binding MaxTimeIsChecked, Mode=TwoWay}" … />
...