- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了一个 UserControl
用于在我的应用程序中显示超链接。
UserControl
的标记如下:
<UserControl x:Class="MVVMExample.View.UserControls.ActionLink"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<TextBlock Margin="5">
<Hyperlink Command="{Binding LinkCommand}" CommandParameter="{Binding LinkCommandParameter}">
<TextBlock Text="{Binding LinkText, UpdateSourceTrigger=PropertyChanged}"/>
</Hyperlink>
</TextBlock>
</Grid>
</UserControl>
UserControl
的 DataContext
位于 CodeBehind 中,如下所示:
public partial class ActionLink : UserControl, INotifyPropertyChanged
{
public static readonly DependencyProperty LinkTextProperty = DependencyProperty.Register(
"LinkText", typeof (string), typeof (ActionLink), new PropertyMetadata(LinkTextChanged));
public static readonly DependencyProperty LinkCommandParameterProperty = DependencyProperty.Register(
"LinkCommandParameter", typeof (object), typeof (ActionLink),
new PropertyMetadata(LinkCommandParameterChanged));
public static readonly DependencyProperty LinkCommandProperty = DependencyProperty.Register(
"LinkCommand", typeof (ICommand), typeof (ActionLink), new PropertyMetadata(LinkCommandChanged));
public ActionLink()
{
InitializeComponent();
}
public object LinkCommandParameter
{
get { return GetValue(LinkCommandParameterProperty); }
set { SetValue(LinkCommandParameterProperty, value); }
}
public string LinkText
{
get { return (string) GetValue(LinkTextProperty); }
set
{
SetValue(LinkTextProperty, value);
OnPropertyChanged();
}
}
public ICommand LinkCommand
{
get { return (ICommand) GetValue(LinkCommandProperty); }
set { SetValue(LinkCommandProperty, value); }
}
public event PropertyChangedEventHandler PropertyChanged;
private static void LinkTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ActionLink) d).LinkText = (string) e.NewValue;
}
private static void LinkCommandParameterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ActionLink) d).LinkCommandParameter = e.NewValue;
}
private static void LinkCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ActionLink) d).LinkCommand = (ICommand) e.NewValue;
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
一切正常。
现在,如果我想将此 UserControl
与命令绑定(bind)一起使用,我必须执行以下操作:
<userControls:ActionLink LinkText="View customers" LinkCommand="{Binding DataContext.ViewCustomersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>
如果我改用 Button
,则不必提供 RelativeSource
。有没有机会我也不必为自定义创建的 UserControl
的绑定(bind)属性提供 RelativeSource
?
最佳答案
当你写作时
<userControls:ActionLink LinkCommand="{Binding ViewCustomersCommand}"/>
WPF 尝试建立到 UserControl 的 DataContext 中的 ViewCustomersCommand
属性的数据绑定(bind),该属性通常继承自控件的父级,并持有对某个 View 模型对象的引用。这在这里不起作用,因为您已将 DataContext 显式设置为 UserControl 实例。
只要您的 UserControl 中具有可绑定(bind)属性(即依赖属性),您就不应该设置它的 DataContext。如果这样做,您将始终必须明确指定绑定(bind)源对象,因为不再继承 DataContext。
所以删除
DataContext="{Binding RelativeSource={RelativeSource Self}}"
从您的 UserControl 的 XAML 设置并在其所有内部绑定(bind)中设置一个 RelativeSource:
<Hyperlink
Command="{Binding LinkCommand,
RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding LinkCommandParameter,
RelativeSource={RelativeSource AncestorType=UserControl}}">
<TextBlock
Text="{Binding LinkText,
RelativeSource={RelativeSource AncestorType=UserControl}}"/>
</Hyperlink>
关于c# - UserControl 的 RelativeSource 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29075720/
这是代码: item1
我有一个作为 excel 插件运行的 WPF 应用程序,它有这样的可视化树 精益求精 元素主机 WPF 用户控件 WPF 色带条控件 现在,在 excel 中加载插件时,不会启用位于 WPF 功能区栏
我正在使用绑定(bind) RelativeSource与 FindAncestor模式但绑定(bind)不起作用。如何调试并查看它是否能够找到祖先? 最佳答案 使用 Snoop 编辑:您当然可以使用
我正在尝试将 DataGridTextColumn 的背景颜色设置为另一种颜色(如果它是只读的)。我正在使用以下代码这样做:
是 FindAncestor在Window的整个Visual树中搜索一个元素? 如果是,那我该如何改进呢? 是 binding data error如果我们通过使用 Find Ancestor 找到一
我正在使用以下(简化的)代码在 ItemsControl 中的所有项目中显示一个元素,但第一个除外: NullToVisibility是一个简单的转换器,返回 Visibility.Hidden如果
我正在尝试创建一个包含 ListBox 的 View ,该 ListBox 的 ItemsSource 属性绑定(bind)到 ObservableCollection 并且其 ItemTemplat
我是 WPF 和 MVVM 模式的新手,所以我的绑定(bind)有一些问题。 在客户的详细信息 View 中,我想在组合框中列出一些状态。 在我的 ViewModel 中,客户处于根级别,状态列表也是
我正在尝试在项目控件 ItemContainerStyle 中使用转换器将 ItemsControl 中项目的属性转换为 X 值。要进行转换,我还需要对包含 ItemsControl 的父级 User
只是在这里做一个小测试。这两个文本框中只有第一个显示值“123”。为什么不是第二个? 最佳答案 用RelativeSource代替Source,像这样: 关于c# - WP
我试图在我的 Xaml 中绑定(bind)几个不同的属性: 你会注意到我在这里使用了两种不同的绑定(bind)技术。使用元素名称的工作,另一个不工作。这是后面的代码: public string D
我对 whn 在绑定(bind)时使用 {RelativeSource Self} 感到困惑。以下三个绑定(bind)在我看来是一样的,其中 MyText 是我的 View 模型中的一个属性。
对于以下 MultiBinding 表达式,如果多次更改 PropB,绑定(bind)引擎将搜索 DataGrid 祖先多少次? 如果 PropertyC(及其路径)
我已经构建了一个基于 WPF 的 Treeview 元素 -子项目 如果选择了子项目,我还想显示项目的属性。 我想我需要使用 RelativeSource 语句,但不太确定如何使用。
我创建了一个 UserControl 用于在我的应用程序中显示超链接。 UserControl 的标记如下:
我有一种情况需要使用描述的技术 here解析绑定(bind)引用 RelativeSource 的绑定(bind)。我正在使用自定义标记扩展来允许我将实际的 Binding 对象分配给 Depende
有人可以向我解释以下 XAML 行吗? DataContext="{Binding RelativeSource={RelativeSource Self}}" Here简单的使用示例。 如何用 C#
我有一个控件,在该控件内我有一个带有数据模板的资源: xmlns:vm="clr-namespace:CortexMonitoringTool.ViewModel" 我将 vm
我尝试使用 {RelativeSource PreviousData}在 ListBox.ItemTemplate它工作正常。 但是,当使用下面提供的特定代码时,绑定(bind)会在向上向下滚动几次和
我有以下 XAML,它完成了它应该做的所有事情,除了 FontSize 上的 MultiBinding 在检索用户时失败(当我在转换器中设置断点时,我看到了 DependencyProperty.Un
我是一名优秀的程序员,十分优秀!