【发布时间】:2017-05-25 23:41:36
【问题描述】:
我正在构建一个 WPF 应用程序,作为其流程的一部分,它会检查网络连接并在 TextBlock 中显示 IP 地址。
现在,无论出于何种原因,每次 IP 地址发生更改时,我都会尝试更新 TextBlock Text 属性。
我的 IP 地址更改工作正常,但我无法让 INotifyPropertyChanged 工作。
我阅读了所有可能的解决方案和实现,但我想不出一个有效的代码。
公共属性从 Network Helper 类的静态字符串中获取值。 所以,代码:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
public string ipAddress
{
get { return NetworkStatus.localIP; }
set
{
if (value != NetworkStatus.localIP)
{
NetworkStatus.localIP = value;
NotifyIPChanged("IpAddress");
}
}
}
private void NotifyIPChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
XAML:
<TextBlock x:Name="ipTxt"
TextWrapping="Wrap"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="{Binding DataContext.ipAddress}"
Height="30"
Width="110"
Margin="-30,10,0,-10"
/>
更新 NetWorkStatus.cs -- 静态布尔 IsNetworkAvailable() ...
if (statistics.BytesReceived > 0 || statistics.BytesSent > 0)
{
IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
localIP = host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork).ToString();
return true;
}
如您所见,此方法设置了一个静态字符串“localIP”。然后由 IpAddress 属性对其进行评估。
为什么当 IP 地址更改时 TextBlock Text 属性没有更新?
【问题讨论】:
-
NotifyIPChanged("IpAddress");应该是 NotifyIPChanged("ipAddress");甚至更好的 NotifyIPChanged(nameOf(ipAddress));或考虑使用 CallerMemberName,然后您根本不必传递名称。
-
将属性重命名为
IpAddress,使其符合广泛接受的命名约定。除此之外,NotifyIPChanged对于可以为任何属性名称触发 PropertyChanged 事件的方法来说似乎是一个奇怪的名称。此方法的典型名称为NotifyPropertyChanged、RaisePropertyChanged或OnPropertyChanged。 -
感谢您的语义建议。我修好了它们。无论如何,应用程序行为不会改变。处理程序没有启动。
-
绑定也是错误的。应该是
Text="{Binding IpAddress}",因为绑定的默认来源已经是当前的DataContext了。 -
按照克莱门斯的建议做了。还是不行。真的不明白为什么。
标签: wpf binding inotifypropertychanged