MVVM中的可见性转换器未更新

时间:2019-04-30 13:23:00

标签: c# mvvm visibility converters

我想根据某个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 个答案:

答案 0 :(得分:3)

您的TotalStarthh属性更改。您的用户界面会收到通知。但是,您从未通知UI IsTimeValid也可能已更改。

您可以将IsTimeValid设置为普通属性,并在每次相关属性更改时将其设置为所需的布尔值。

或者,您每次更改所使用的两个属性时,都可以通知UI 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 :(得分:1)

在通知之前,您需要将属性实际设置为新值。 为此,请使用带有后备字段的属性。

# Wrong
data$i 

# Right
data[i]

尽管如此,强烈建议您使用Prism MVVM Framework。它具有SetProperty函数,可在一行中为您完成所有这些工作。