首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类属性作为数据触发器

类属性作为数据触发器
EN

Stack Overflow用户
提问于 2016-07-22 16:19:50
回答 3查看 1.3K关注 0票数 0

我有这样的代码,当用户控件中的属性发生变化时,我希望在主窗口中更新图像。但不知怎么我没能让扳机起作用。

一些XAML代码

代码语言:javascript
复制
<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>

财产来源的部分

代码语言:javascript
复制
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编辑器中看到了调试过程中的属性,因此它似乎被识别了,并且我也看到了这个值是合适的。但不知何故,策划人并没有被处决。有人对此有什么想法吗?

谢谢,祝您今天愉快!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-22 16:22:17

您需要在PropertyChanged上引发pingable事件,以便更新视图。

基本上,为了让视图知道它需要基于绑定更新某些控件,您的视图模型需要实现INotifyPropertyChanged;当您想要根据视图模型中的更改更新视图时,您需要从视图模型中提取PropertyChanged,并将值被更新的绑定属性的名称传递给它。

票数 1
EN

Stack Overflow用户

发布于 2016-07-22 16:55:13

如果您在getter和setter上使用RaisePropertyChanged,它将在属性更改时通知XAML并触发触发器。试试下面的代码:

代码语言:javascript
复制
 bool _pingable;
 public bool pingable 
 {
    get{return _pingable;} 
    set{ _pingable = value; RaisePropertyChanged;}
 };
票数 0
EN

Stack Overflow用户

发布于 2016-07-22 17:47:12

虽然我之前的另外两个答案指出,INotifyPropertyChanged需要实现--这对于一个普通的WPF应用程序来说有些重要--我认为这实际上并不重要。您的ping请求看起来是同步的,因此在更新值时UI实际上不会加载,这使得INotifyPropertyChanged变得无关紧要。

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        Thread.Sleep(2000);  // pretending to ping
        Flag = true;
    }

    public bool Flag { get; set; }
}

XAML:

代码语言:javascript
复制
<Grid>
    <CheckBox IsChecked="{Binding Flag}" />
</Grid>

当窗口最终加载时,将对此进行检查。如果这是异步的,这将是一个不同的故事。

我在XAML编辑器中看到调试过程中的属性。

我不知道这意味着什么。我怀疑这里的实际问题是您没有定义DataContext。(也许是,但我在这里看不到!)

你已经在窗口上创建了属性,所以.如果你把扳机调成..。

代码语言:javascript
复制
<DataTrigger Binding="{Binding Path=pingable, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Value="false">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38531190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档