Конвертер видимости в MVVM не обновляется - PullRequest
1 голос
/ 30 апреля 2019

Я хочу изменить видимость Grid в зависимости от того, больше ли значение одного TextBoxes, чем другого TextBoxes. Я использую MVVM и имею следующий код:

XAML

<UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVis"/>
</UserControl.Resources>

<Grid x:Name="TimeError" Visibility="{Binding Path=IsTimeValid, Converter={StaticResource BoolToVis}}">
    <TextBlock Text="Incorrect value"/>
</Grid>

<TextBox x:Name="TotalStarthh" MaxLength="2" FontSize="16" Width="28" Text="{Binding TotalStarthh}"/>
<more TextBoxes/>

В ViewModel я анализирую textBoxes до целочисленного значения и вычисляю общее время.

private string _TotalStarthh;
public string TotalStarthh
{
    get { return _TotalStarthh; }
    set { _TotalStarthh = value; NotifyPropertyChanged(); }
}
//The same for the other TextBoxes.

public int Totalstart()
{
    int.TryParse(TotalStarthh, out int TShh);
    int.TryParse(TotalStartmm, out int TSmm);
    int.TryParse(TotalStartss, out int TSss);
    //calculating hours:mins:sec to total seconds
    //This can be over 24 hours so datetime is not used
    int Totalstart = TShh * 3600 + TSmm * 60 + TSss;
    return Totalstart;
}

public int Totalend()
{
    int.TryParse(TotalEndhh, out int TEhh);
    int.TryParse(TotalEndmm, out int TEmm);
    int.TryParse(TotalEndss, out int TEss);
    //calculating hours:mins:sec to total seconds
    //This can be over 24 hours so datetime is not used
    int Totalend = TEhh * 3600 + TEmm * 60 + TEss;
    return Totalend;
}

// validate that start time is lower than end time.
public bool IsTimeValid
{
    get { return (Totalstart > Totalend); }
    set { NotifyPropertyChanged(); }
}

Но это не обновляет видимость Grid. Я делаю NotifyPropertyChanged неправильно? Я довольно новичок в mvvm и все еще пытаюсь понять это. Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 30 апреля 2019

Ваше TotalStarthh свойство изменяется. И ваш пользовательский интерфейс уведомлен об этом. Но вы никогда не уведомляли пользовательский интерфейс о том, что IsTimeValid тоже мог измениться.

Вы можете сделать IsTimeValid обычным свойством и установить для него логическое значение, которое вы хотите каждый раз, когда изменяется зависимое свойство.

Или вы можете уведомить пользовательский интерфейс о том, что IsTimeValid изменяется каждый раз, когда вы меняете два используемых свойства. Чтобы объяснить, как, нам нужно знать, как на самом деле выглядит ваш NotifyPropertyChanged.

Если бы мне пришлось сделать предположение, я бы сказал, что это может сработать:

public string TotalStarthh
{
    get { return _TotalStarthh; }
    set 
    {
         _TotalStarthh = value;
         NotifyPropertyChanged(); // notifies the UI this property has changed
         NotifyPropertyChanged("IsTimeValid"); // notifies the UI IsTimeValid has changed 
    }
}
1 голос
/ 30 апреля 2019

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

private bool isTimeValid;
public bool IsTimeValid
{ 
  get { return (Totalstart > Totalend); }
  set
  {
    if(value != isTimeValid)
      {
        isTimeValid = value;
        NotifyPropertyChanged(nameof(IsTimeValid));
      }
   }
 }

Настоятельно рекомендуется использовать Prism MVVM Framework, хотя. Он имеет функцию SetProperty, которая выполняет всю эту работу за вас в одной строке.

...