- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个在后台执行操作并可通过托盘图标进行控制的应用程序。这个托盘图标有一个带有复选框的上下文菜单,可以将其设置为已启用,然后后台任务就会启动。
我正在使用 WPF 和 Hardcodet WPF NotifyIcon。
这是我的 MainWindow.xaml:
<Window x:Name="mainWindow" x:Class="MyTrayApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyTrayApplication"
xmlns:tb="http://www.hardcodet.net/taskbar"
mc:Ignorable="d"
Title="MainWindow" Height="10" Width="10" Visibility="Hidden">
<tb:TaskbarIcon x:Name="taskbarIcon" IconSource="MyTrayApplication.ico" ToolTipText="My tray application" >
<tb:TaskbarIcon.ContextMenu>
<ContextMenu>
<MenuItem x:Name="enabledItem" Header="Enabled" IsCheckable="True" IsChecked="{Binding Path=Enabled, ElementName=mainWindow, UpdateSourceTrigger=PropertyChanged}"/>
<MenuItem x:Name="configureItem" Header="Configure..." Click="configureItem_Click"/>
<MenuItem x:Name="exitItem" Header="Exit" Click="exitItem_Click"/>
</ContextMenu>
</tb:TaskbarIcon.ContextMenu>
</tb:TaskbarIcon>
</Window>
这是我的代码:
using System;
using System.Windows;
namespace MyTrayApplication {
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
private bool _enabled;
public MainWindow() {
InitializeComponent();
}
private void exitItem_Click(object sender, RoutedEventArgs e) {
Close();
}
private void configureItem_Click(object sender, RoutedEventArgs e) {
// Code to fire up configuration
}
public bool Enabled {
get {
return _enabled;
}
set {
_enabled = value;
Console.WriteLine(value);
// Code to enable the background task
}
}
}
}
这是行不通的。运行时我在输出中得到以下内容:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=mainWindow'. BindingExpression:Path=Enabled; DataItem=null; target element is 'MenuItem' (Name='enabledItem'); target property is 'IsChecked' (type 'Boolean')
奇怪的是:当我为 IsChecked
输入 ElementName=
时,在 XAML 编辑器中发现 mainWindow
IS> 绑定(bind),正如 IntelliSense 向我展示的那样。
做 的工作是在 InitializeComponent();
之后以编程方式在代码隐藏中设置 DataContext
:
DataContext = this;
然后将绑定(bind)更改为:
IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"
这会输出以下内容:
System.Windows.Data Error: 40 : BindingExpression path error: 'Enabled' property not found on 'object' ''TaskbarIcon' (Name='taskbarIcon')'. BindingExpression:Path=Enabled; DataItem='TaskbarIcon' (Name='taskbarIcon'); target element is 'MenuItem' (Name='enabledItem'); target property is 'IsChecked' (type 'Boolean')
但它有效。
我在这里做错了什么?还是以编程方式设置 DataContext
?
最佳答案
您正在处理 ContextMenu
。这是最难处理的控件之一,因为它实际上是一个独立的窗口,它有自己的可视化树。你必须想象底层正在做类似这样的事情:
Window contextMenu = new Window();
contextMenu.Show();
这个窗口实例显然不能直接绑定(bind)到创建它的 MainWindow,可以吗?
绑定(bind)
ContextMenu 本身就是一个单独的实体。默认情况下,它的 DataContext
与父级(放置目标)隔离。幸运的是,ContextMenu 具有 PlacementTarget
属性,它自动成为您将其放入 XAML 中的对象。
<SomeControl>
<SomeControl.ContextMenu>
<ContextMenu ....>
<!-- This ContextMenu's PlacementTarget is automatically SomeControl -->
<ContextMenu>
</SomeControl.ContextMenu>
</SomeControl>
为了进行绑定(bind),您需要这样做:
<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.DataContext}" ...>
对于您的情况,您正在使用一些外部 API。显然这个自定义控件已经将 DataContext 设置为其放置目标的 DataContext。
你的问题是因为你的窗口的 DataContext 没有设置为它自己,你已经解决了。 xaml 或代码隐藏都同样有效。
元素名称
当您使用ElementName
时,绑定(bind)引擎通常会忽略DataContext。它将开始在它自己的可视树 中寻找具有特定名称的元素。就像我最初所说的那样,ContextMenu 有自己的可视化树,因此显然它无法在其可视化树中找到该元素。
关于c# - 未找到具有显式 ElementName 的 WPF DataBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38139705/
我正在尝试在 android 中学习 ViewModel,在我的第一阶段学习中,我正在尝试使用 ViewModel 和 DataBinding 来更新 UI(TextView)。在 ViewModel
在 ASP.NET 中,您可以单独绑定(bind)控件(即 GridView1.DataBind() ),也可以调用 Page.DataBind()绑定(bind)页面上的所有控件。 这两个调用之间有
如何使用新的 dataBinder 插件进行双向绑定(bind)(从 UI 到数据以及从数据到 UI)? 非常感谢! 最佳答案 我们还没有这个,也许在 v1 之后。不确定您的用例是什么,但我们已经为每
我正在尝试将 Kotlin 与 DataBinding 一起使用,但我遇到了这个错误: Error:[kapt] An exception occurred: java.lang.annotation
我只是将我的项目转换为 androidX 并成功构建项目。但是当我想运行那个时间时,它在启用了 java 的 android studio 3.5.3 中创建了这个错误。 这是我的项目 gradle:
这个问题在这里已经有了答案: no cached version available for offline mode (11 个回答) 2年前关闭。 无法确定任务的依赖关系 :app:compile
这是一个与今天无关的老问题。请参阅 Android 开发人员的说明。与四年前相比,现在将数据绑定(bind)应用于您的项目要容易得多。 我正在阅读 https://developer.android.
异常(exception)情况如下: java.lang.NullPointerException: Attempt to read from field 'java.lang.Runnable an
构建项目时收到以下警告 DSL element 'android.dataBinding.enabled' is obsolete and has been replaced with 'androi
今天升级Android Studio 2.3后,构建项目失败。 当构建项目 gradle console 显示这个错误: FAILURE: Build failed with an exception
我有一个消息列表,我将这些消息的模板绑定(bind)到单击事件中,然后在该模板内,我有一个超链接绑定(bind)到 js 函数,该函数应该打开一个 mailto 页面。 但是,尽管 js 函数执行,但
我在 Wildfly 8.2.1 和 Glassfish 4.1 中使用 Spring Data JPA 部署 Spring MVC 应用程序时遇到问题(它在 Wildfly 10 中工作,但我不允许
我为横向创建了一个替代布局 XML 文件。使用 DataBindingUtil 的填充在纵向模式下工作正常,但在加载自定义 XML 文件时在横向模式下崩溃。 使用数据绑定(bind)的布局膨胀: cl
数据绑定(bind)到控件的可见属性时是否存在任何已知问题? 无论我的属性是什么,该控件始终不可见。 Public ReadOnly Property IsRibbonCategory() As Bo
使用数据绑定(bind),如何绑定(bind)使用值类型的新对象? 简单的例子: public class Person() { private string _firstName;
我有一个 Image 控件,它的源绑定(bind)到对象上的属性(字符串 url 到图像)。进行服务调用后,我使用新 URL 更新数据对象。在调用 PropertyChanged 事件后,它离开我的代
我想在传入的绑定(bind)整数上添加一个常量值。事实上,我有几个地方想要绑定(bind)到相同的源值但添加不同的常量。所以理想的解决方案是这样的...... (注意:这是一个展示这个想法的例子
我正在开发一个 Windows Phone 应用程序。我将 List 绑定(bind)到内容控制元素。 在转换器中,我返回指定参数的字符串。
天哪!我讨厌这个。为什么这么复杂? 我正在尝试做的事情: 我有一个包含多个用户控件的表单,每个控件都有一个数据网格。每个网格通过 .ItemSource 属性与 ObservableCollectio
我正在使用数据绑定(bind)并且我已经声明了 lateinit var对于绑定(bind)以及当我要去不同的 fragment Leaky canary 显示泄漏时。 fragment class
我是一名优秀的程序员,十分优秀!