gpt4 book ai didi

c# - 如何为绑定(bind)路径传递嵌入式控件的属性?

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:47 24 4
gpt4 key购买 nike

我有带嵌套(自定义)控件的自定义控件。我想从嵌套控件中获取属性并将其传递给主控件的转换器。这是我的代码:

<Button.IsEnabled>
<MultiBinding Converter="{x:Static app:MainControl.CanExcludeConverter}">
<Binding Path="PageIndex" ElementName="nav_pane"/>
<Binding Path="History" />
</MultiBinding>
</Button.IsEnabled>

第二个参数传递正确,但第一个参数传递不正确——无论我做什么我都只得到 DependencyProperty.UnsetValue。首先,我将 PageIndex 作为带有通知程序的属性,然后我将其设为依赖属性,然后我尝试了几种设置绑定(bind)的方法——完全没有成功。

“nav_pane”是我的自定义控件的名称,它嵌套在 MainControl 中。 PageIndex 是 NavPane 的依赖属性。

我错过了什么?

编辑

1

更长的例子。 MainControl 实际上由 NavPane 组成,仅此而已:-) 由于在 NavPane 中将依赖属性设置为“插槽”,我可以在 NavPane 的框架(矩形)内添加新控件。所以它是这样开始的:

<UserControl x:Class="Worture.MainControl"
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"
xmlns:app="clr-namespace:Worture"
mc:Ignorable="d"
Height="Auto" Width="320"
BorderThickness="2" BorderBrush="Navy"
MouseEnter="UserControl_MouseEnter"
IsVisibleChanged="UserControl_IsVisibleChanged"
Loaded="UserControl_Loaded">
<Grid Margin="4,0,4,4">
<app:NavPane x:Name="nav_pane"
OnNavigation="UpdateNavPane">
<app:NavPane.UpperSlot>
<Button Margin="4,0,0,0">
<StackPanel Orientation="Horizontal">
<app:AutoGreyableImage Source="/Worture;component/Images/plus.png" Width="24" Height="24"/>
</StackPanel>
<Button.IsEnabled>
...

其余的在上面。

2

NavPane 中的依赖属性。

    public static readonly DependencyProperty PageIndexProperty =
DependencyProperty.Register(NameOf.Get((NavPane dlg) => dlg.PageIndex),
typeof(int?),
typeof(NavPane),
new UIPropertyMetadata(null));

public int? PageIndex
{
get { return (int?)GetValue(PageIndexProperty); }
set { SetValue(PageIndexProperty, value); }
}

NameOf 是在 SO 上找到的一个很好的类,它获取属性、字段等的名称。多亏了它,我避免了神奇的数字,我更适合混淆。

3

我将 UnsetValue 作为转换器中的输入参数。 PageIndex 设置在各种场合(也取决于用户)。但为了集中注意力,我将它(现在)设置为 null 作为构造函数中的第一行。所以理论上我应该得到这样的论点——null(如“int?”)。

最佳答案

很可能您没有正确地将 Button 添加为 NavPane 的逻辑子项。基本上,您应该调用 AddLogicalChild在您的 NavPane 上为每个添加到您的 UpperSlot 集合的项目。您还应该调用 RemoveLogicalChild对于从您的收藏中移除的任何东西。

最后,您需要覆盖 LogicalChildren在 NavPane 中并将项目包含在您的集合中(除了基本版本返回的任何内容)。

如果 UpperSlot 不是一个集合,那么您只需要添加/删除它所引用的单个元素。

Kent Boogaart 对这个 here 写得很好.可以找到有关 ElementName 解析的更多信息 herehere .

关于c# - 如何为绑定(bind)路径传递嵌入式控件的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6204609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com