繁体   English   中英

WPF-类属性作为数据触发器

[英]WPF - class property as data trigger

当用户控件中的属性更改时,我在这段代码中要更新主窗口中的图像。 但是以某种方式我无法使触发器起作用。

一些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">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM