我想根据某个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相当陌生,并且仍在尝试掌握它。预先感谢。
答案 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函数,可在一行中为您完成所有这些工作。