WPF-将属性类作为数据触发器
本文关键字:数据 触发器 属性 WPF- | 更新日期: 2023-09-27 17:58:11
我有这样的代码,当用户控件中的属性更改时,我想在主窗口中更新图像。但不知怎么的,我无法启动扳机。
某些XAML代码
<StatusBar MinHeight="10" MaxHeight="20" VerticalAlignment="Bottom" Grid.Row="2">
<Image x:Name="SomeNameHere">
<Image.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=pingable}" Value="false">
<Setter Property="Image.Source" Value="Icons/MainWindow/StatusOffline_stop_32x.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=pingable}" Value="true">
<Setter Property="Image.Source" Value="Icons/MainWindow/StatusOK_32x.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</StatusBar>
属性来自的部分
public bool pingable { get; set; }
public MainWindow()
{
InitializeComponent();
pingable = PingHost("some random IP");
}
public bool PingHost(string nameOrAddress)
{
pingable = false;
Ping pinger = new Ping();
try
{
PingReply reply = pinger.Send(nameOrAddress);
pingable = reply.Status == IPStatus.Success;
}
catch (PingException)
{
// Discard PingExceptions and return false;
}
return pingable;
}
我在XAML编辑器中的调试过程中看到了该属性,因此它似乎得到了识别,而且我还看到了适合的值。但不知怎么的,二传手没有被执行。有人对此有想法吗?
谢谢,祝你今天愉快!
您需要在pingable
上引发PropertyChanged
事件以更新视图。
基本上,为了让视图知道它需要更新一些基于绑定的控件,您的视图模型需要实现INotifyPropertyChanged
;每当您希望根据视图模型中的更改更新视图时,都需要从视图模型中引发PropertyChanged
,并将其值已更新的绑定属性的名称传递给它。
如果在getter和setter上RaisePropertyChanged,它将在属性更改时通知XAML,并触发触发器。试试这个代码:
bool _pingable;
public bool pingable
{
get{return _pingable;}
set{ _pingable = value; RaisePropertyChanged;}
};
虽然前面的另外两个答案指出INotifyPropertyChanged
需要实现——这对普通的WPF应用程序来说有些重要——但我认为这在这里并不重要。您的ping请求看起来是同步的,所以在您更新值时,UI实际上不会被加载,从而使INotifyPropertyChanged
不相关。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
Thread.Sleep(2000); // pretending to ping
Flag = true;
}
public bool Flag { get; set; }
}
XAML:
<Grid>
<CheckBox IsChecked="{Binding Flag}" />
</Grid>
当窗口最终加载时,会选中此项。如果这是异步的,那就另当别论了。
我在XAML编辑器中调试期间看到该属性
我不知道这意味着什么。我怀疑这里的实际问题是没有定义DataContext。(也许是,但我在这里看不到!)
您已经在窗口上创建了属性,所以…如果您将触发器切换为…会怎样
<DataTrigger Binding="{Binding Path=pingable, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Value="false">