如何以编程方式绑定 DataTemplate 内控件的(依赖项)属性?

2024-03-20

The TextBlock居住在一个DataTemplate,因此我无法通过其名称来引用它。那么我该如何绑定它(例如)Text以编程方式属性?

XAML:

<UserControl x:Class="MyNameSpace.MyCustomControl" ... >
    ...
    <ListBox ItemsSource="{Binding Path=ItemsSource}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    ...
</UserControl>

Code:

public partial class MyCustomControl : UserControl {
    ...

    public static readonly DependencyProperty DataSourceProperty =
        DependencyProperty.Register("DataSource", typeof (IEnumerable),
                                    typeof (MyCustomControl),
                                    new PropertyMetadata(default(IEnumerable)));

    public IEnumerable DataSource {
        get { return (IEnumerable) GetValue(DataSourceProperty); }
        set { SetValue(DataSourceProperty, value); }
    }

    public static readonly DependencyProperty MemberPathProperty =
        DependencyProperty.Register("MemberPath", typeof (string),
                                    typeof (MyCustomControl),
                                    new PropertyMetadata(default(string)));

    public string MemberPath {
        get { return (string) GetValue(MemberPathProperty); }
        set { SetValue(MemberPathProperty, value); }
    }
    ...
    public MyCustomControl() {
        InitializeComponent();

        var binding = new Binding(MemberPath);
        BindingOperations.SetBinding(/*how do I refer to the TextBlock here ???*/,
                                     TextBox.TextProperty, binding);
    }
    ...
}

预期用途示例:

<my:MyCustomControl DataSource="{Binding Path=SomeModelCollection}" MemberPath="Name"

Where SomeModelCollection是一些数据模型属性,例如ObservableCollection<SomeModel> (SomeModel有一个属性叫做Name)


你可以得到TextBlock using VisualTreeHelper。此方法将获取 listBoxItem 的可视树中存在的所有 TextBlock:

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj)
            where T : DependencyObject
{
   if( depObj != null )
   {
       for( int i = 0; i < VisualTreeHelper.GetChildrenCount( depObj ); i++ )
       {
          DependencyObject child = VisualTreeHelper.GetChild( depObj, i );
          if( child != null && child is T )
          {
              yield return (T)child;
          }

          foreach( T childOfChild in FindVisualChildren<T>( child ) )
          {
             yield return childOfChild;
          }
       }
    }
}

Usage :

TextBlock textBlock = FindVisualChildren<TextBlock>(listBoxItem)
                       .FirstOrDefault();

但我仍然建议在 XAML 中进行绑定,而不是在后面的代码中进行绑定。

In case ItemSource is ObservableCollection<MyModel> and MyModel包含属性Name,可以像这样在 XAML 中完成:

<DataTemplate>
   <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Name}"/>
   </StackPanel>
 </DataTemplate>

Since DataContext of ListBoxItemMyModel,因此您可以像上面提到的那样直接绑定到 Name 属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式绑定 DataTemplate 内控件的(依赖项)属性? 的相关文章

随机推荐

  • 如何在给定特定 PID 的情况下终止 Java 中的进程

    如果我有特定的 PID 如何在 Windows 上从 Java 代码中终止特定进程 除了执行特定的操作之外 我不知道任何其他解决方案Windows命令就像Runtime getRuntime exec taskkill F PID 827
  • 为什么在尝试更新 OData 服务时 HttpWebRequest.GetResponse() 会挂起?

    我正在用 C 编写一个 OData 消费者 我可以成功删除一个条目 但由于某种原因 当我尝试更新时 它只是挂起 冻结在 GetResponse 上 它甚至忽略了我的超时 下面是我的测试代码 有什么明智的建议吗 XDocument doc X
  • 在 C 中取消引用字符串文字有什么影响?

    include
  • 在移动设备上拖放 HTML

    当您使用JavaScript向网页添加拖放功能 例如jQuery UI可拖放 时 如何在通过移动设备上的浏览器查看时使其发挥作用 在移动设备上 触摸屏的拖动操作会被拦截手机用于滚动页面等 欢迎所有解决方案 我最初的想法是 为移动设备提供一个
  • scriptcs - 无法读取包

    我关注了一个博客文章 http inaspiralarray blogspot com 2013 08 scriptcs in two minutes html只需两步即可运行 scriptcs 基本上 我是这样做的 powershell
  • 删除不在引号内的哈希注释

    我正在使用 python 来浏览文件并删除所有注释 评论被定义为散列及其右侧的任何内容只要哈希值不在双引号内 我目前有一个解决方案 但它似乎不是最佳的 filelines r re compile for line in f m r spl
  • 如何在 vscode 中将 .css 文件解析为 PostCSS?

    我在项目中使用PostCSS CSS文件的扩展名是 css所以当我打开一个时 它会指示一堆错误 由于 PostCSS 的语法 我已经尝试安装stylelint PostCSS syntax扩展等等 但没有任何效果 如果我将扩展名更改为 sc
  • 对话框中按钮的自定义放置 - jquery ui

    我想将添加到对话框的按钮移动到顶部或左侧 我正在使用 jquery ui 如何做到这一点 添加 ok 后 它会显示在最右端 可以将其放置在周围吗 function dialog message dialog modal true resiz
  • 使 Flexbox 上下颠倒换行

    今天 我正在查看我构建的 选项卡 HTML gizmo 我注意到由于我使用 inline block 来布局选项卡标题 当它们包装时 我会得到如下所示的输出 Apple Banana Cherry Date Elderberry Fig G
  • 使用 Gulp 将 browserify 模块设为外部

    我有一个图书馆lib js我想从中创建lib a js and lib b js并能够从脚本中使用它client js using var a require lib a js 当我只包含已编译的内容时它就可以工作lib js之前的图书馆c
  • 在 Google Apps 脚本中比较日期范围与今天的日期

    我希望使用这篇文章作为参考 将从电子表格中提取的日期与今天的日期进行比较 如何使用 Google Apps 脚本将日期与电子表格进行比较 https stackoverflow com questions 14350671 how do i
  • 访问派生类中的基类成员

    我有一个简单的课程如下 class A protected int x class B public A public int y void sety int d y d int gety return y int main B obj o
  • JetBrains Toolbox 应用程序在 Windows 上为空白

    我在 Windows 10 上安装了 JetBrains Toolbox 应用程序 但是当我启动它时 它只显示一个空白边框 如下所示 我尝试重新安装它但仍然不起作用 有人知道如何解决这个问题吗 看起来类似于ALL 1419 https yo
  • 那么如何通过终端打开Android SDK Manager呢? [复制]

    这个问题在这里已经有答案了 我已经将 CD 放入终端中的 android 工具目录中 我尝试输入 android 并按回车键 我也尝试输入 android sdk 并按回车键 但 sdk 管理器不会出现 有什么解决方案或建议可以帮助我了解我
  • HTML5 Canvas 形状从圆形到三角形

    我一直在环顾四周 似乎找不到一种清晰的方法来使形状从圆形变为三角形或矩形或相反 我假设我可以以某种方式存储形状并更改其属性以转换它 基本上我要问的是 如何绘制一个圆形 然后单击按钮将其动画化为三角形 画布形状可以吗 Thanks 您可以使用
  • “启动失败。未找到二进制文件。” Snow Leopard 和 Eclipse C/C++ IDE 问题

    不是问题 我刚刚在互联网上搜索了这个问题的解决方案 并认为我会与 SO 的好人分享 我会用通俗易懂的语言来表述 以便新手也能理解 如果这是错误的地方 我们深表歉意 只是想提供帮助 几乎所有尝试使用 Eclipse C C IDE 的 OS
  • 扩展现有协议以符合另一个协议

    你好 我的目标是扩展 在 swift 3 中 我在框架中拥有的协议 以符合另一个协议 protocol SomeProtocol protocol SomeOtherProtocol extension SomeOtherProtocol
  • R:绘制 igraph 时选择性显示节点

    如何绘制 igraph 节点的选择 我有一个现有的图表 但它太复杂了 我希望能够 放大 节点的子集 我能够删除边缘的子集 但我不知道如何 关闭 孤立的节点 当使用network包 该displayisolates FALSE参数执行此操作
  • Typescript 类可以实现可调用接口吗?

    Typescript 接口允许定义函数风格的调用签名 因此 interface A x number number 这可以通过例如一个函数 const a A function x number number return 1 是否可以使用
  • 如何以编程方式绑定 DataTemplate 内控件的(依赖项)属性?

    The TextBlock居住在一个DataTemplate 因此我无法通过其名称来引用它 那么我该如何绑定它 例如 Text以编程方式属性 XAML