WPF 用户控件数据绑定不起作用

2024-02-08

我正在创建一个简单的用户控件,将弹出窗口与文本视图相结合,这没什么疯狂的。当我首先在窗口中将其设置为全部样式时,它工作得很好,但是当我将其移到用户控件中以实际完成它时,它将不再正常工作。

我将最小值和最大值传递给控件,​​然后它会自动创建一个数字列表,以便从该范围内进行选择。在用户控件中,数字列表未正确绑定,谁知道为什么。也许有人可以看一下我的代码。

我读过很多有关此问题的其他问题,但并不真正知道发生了什么。我的输出窗口中没有收到任何错误,因此没有任何线索。无论如何,这是代码 -

用户控件.xaml

<UserControl x:Class="UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Name="Me"
         DataContext="{Binding RelativeSource={RelativeSource Self}}">

<StackPanel>
    <TextBox Name="myTextbox"
             Height="30"
             Margin="0"
             FontSize="14"
             IsReadOnly="True"
             Padding="5,2"
             Text="{Binding Value}" />
    <Popup x:Name="myPopup"
           PlacementTarget="{Binding ElementName=myTextbox}"
           StaysOpen="True">
        <Popup.Style>
            <Style TargetType="{x:Type Popup}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=myTextbox, Path=IsFocused}" Value="True">
                        <Setter Property="IsOpen" Value="True" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Popup.Style>

        <StackPanel>
            <ListView Name="myListView"
                      Height="100"
                      MaxHeight="300"
                      ItemsSource="{Binding List,
                                            UpdateSourceTrigger=PropertyChanged}"
                      SelectionChanged="ListView_SelectionChanged">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Label Width="100"
                               Height="30"
                               Margin="0"
                               Content="{Binding}"
                               FontFamily="Segoe UI"
                               FontSize="14"
                               Padding="5,2" />
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <Button Width="200" Height="30" />
        </StackPanel>
    </Popup>

</StackPanel>

用户控件.xaml.vb

Imports System.ComponentModel
Imports System.Linq.Expressions
Imports System.Collections.ObjectModel

Class UserControl1

' Dependency Properties
Public Shared ReadOnly ListProperty As DependencyProperty = DependencyProperty.Register("List", GetType(ObservableCollection(Of Integer)), GetType(MainWindow))
Public Shared ReadOnly ValueProperty As DependencyProperty = DependencyProperty.Register("Value", GetType(Integer), GetType(MainWindow))
Public Shared ReadOnly MaxValueProperty As DependencyProperty = DependencyProperty.Register("MaxValue", GetType(Integer), GetType(MainWindow))
Public Shared ReadOnly MinValueProperty As DependencyProperty = DependencyProperty.Register("MinValue", GetType(Integer), GetType(MainWindow))

' Properties
Public Property List As ObservableCollection(Of Integer)
    Get
        Return DirectCast(GetValue(ListProperty), ObservableCollection(Of Integer))
    End Get
    Set(value As ObservableCollection(Of Integer))
        SetValue(ListProperty, value)
    End Set
End Property

Public Property Value As Integer
    Get
        Return DirectCast(GetValue(ValueProperty), Integer)
    End Get
    Set(value As Integer)
        SetValue(ValueProperty, value)

    End Set
End Property

Public Property MaxValue As Integer
    Get
        Return DirectCast(GetValue(MaxValueProperty), Integer)
    End Get
    Set(value As Integer)
        SetValue(MaxValueProperty, value)
    End Set
End Property

Public Property MinValue As Integer
    Get
        Return DirectCast(GetValue(MinValueProperty), Integer)
    End Get
    Set(value As Integer)
        SetValue(MinValueProperty, value)
    End Set
End Property

Private Sub ListView_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs)
    Value = List(myListView.SelectedIndex)
End Sub

Private Sub UserControl1_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    List = New ObservableCollection(Of Integer)

    ' Add all available numbers into the list
    For iCounter As Integer = MinValue To MaxValue
        List.Add(iCounter)
    Next

    ' Set the selected index on the list for the value
    myListView.SelectedIndex = Value - MinValue
End Sub
End Class

仅供参考,当我对此进行测试时,我自己在窗口和用户控件设置中设置了最小值和最大值。


我认为你犯了和我刚开始学习 WPF 时一样的错误。我不能保证这个is问题的原因,但由于这是我能看到的唯一原因,我会解决它。不幸的是,有很多糟糕的教程和快速示例展示了如何连接UserControl.DataContext对自己:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Or:

DataContext = this;

现在这是完全可以接受的,如果你don't想要Bind to the UserControl外部,因为它是连接后面代码中定义的属性的一种快速且简单的方法。然而,当你想要Bind从控件外部查看属性,你会发现问题。在这些情况下(如果不是在所有情况下),您应该使用RelativeSource Binding to Bind到你的代码背后的属性:

<TextBox Name="myTextbox" Height="30" Margin="0" FontSize="14" IsReadOnly="True"
    Padding="5,2" Text="{Binding Value, RelativeSource={RelativeSource AncestorType={
    x:Type UserControl1}}}" />

In this Binding, UserControl1是的名字UserControl声明了属性。这应该在所有内部完成Bindings。这样,DataContext is not设置为UserControl,但是Binding仍然可以找到属性。

您可以了解更多有关RelativeSource来自相对源标记扩展 http://msdn.microsoft.com/en-us/library/ms743599.aspxMSDN 上的页面。

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

WPF 用户控件数据绑定不起作用 的相关文章

  • 使一个对象只能被同一程序集中的另一个对象访问?

    每个业务对象都有一个包含 sql 调用的匹配对象 我想限制这些 sql 对象 使其只能由匹配的业务对象使用 如何才能实现这一目标 Update 格雷格提出了关于可测试性的观点 由于 SqlObjects 将包含非常特定于业务流程的 sql
  • 先学Silverlight还是先学WPF?

    看来 Silverlight WPF 是 NET 用户界面开发的长期未来 这很棒 因为我可以看到在客户端和 Web 开发端重用 XAML 技能的优势 但看看 WPF XAML Silverlight 它们似乎是非常庞大的技术 那么从哪里开始
  • 如何在运行时添加到 TreeView 目录

    我有一个TreeView我想允许用户添加和删除子项目 在探索基本功能时 我使用button and a textbox添加此子项 当用户点击button a new TreeViewItem需要创建并设置为我的父项的子项TreeView与t
  • 什么时候值得使用 BindingSource?

    我想我非常了解 BindingSource 类的作用 即在数据源和 UI 控件之间提供一个间接层 它实现了 IBindingList 接口 因此还提供了对排序的支持 而且我已经经常使用它 没有太多问题 但我想知道我使用它的频率是否超过了应有
  • WPF - 如何从 DataGridRow 获取单元格?

    我有一个具有交替行背景颜色的数据绑定 DataGrid 我想根据单元格包含的数据对单元格进行不同的着色 我已经尝试过该线程建议的解决方案 http wpf codeplex com Thread View aspx ThreadId 511
  • 循环访问 VB.NET 中的控件

    我正在创建一个国际象棋程序 它由六十四个黑白背景颜色交替的图框组成 我已经给它们命名了pba1 pba2 pbb1 pbb2 pbc1等等 现在 我只想循环遍历黑色的 例如 我只想循环遍历pba1 pbb2 pbc3等 如何在 VB NET
  • WPF 绑定 CompositeCollection 中的 MenuItem 不起作用

    我在将命令绑定到复合集合中的菜单项时遇到问题 这MenuItem是其一部分ContextMenu这是定义在UserControl Resources 问题是新标签的绑定不起作用 当我将 MenuItem 放置在复合集合之外时 它将起作用 有
  • Vb中读取USB存储设备的序列号

    是否可以使用VB读取USB驱动器的序列号 这将为您提供 net 中驱动器的信息 包括 USB 设备 只需导入这些 导入脚本 导入系统 IO Private Class USBsn Private Sub Button1 Click ByVa
  • Newtonsoft.Json.JsonReaderException

    我的 Newtonsoft Json 有问题 我正在尝试从 URL 解析 JSON 但收到错误 这是 JSON ID 0 Nome we Data 2013 09 16 Orario 00 00 16 Prestazione dfg Sta
  • WPF控件默认大小

    为 wpf 应用程序定义自定义资源主题时 我可以设置宽度 高度等 如何找到这些属性的默认值 即框架中提供的控件中使用的值 WPF 控件通常不包含任何类型的默认大小 WPF 的主要功能点之一是 除非您指定大小 否则所有内容都会动态调整大小 如
  • 无法将像素着色器渲染到 RenderTargetBitmap!请帮忙!

    我编写了一个非常简单的 WPF 应用程序来测试渲染具有与 RenderTargetBitmap 关联的像素着色器的控件的能力 然后我将位图写入文件 jpeg 该控件被渲染到位图上 但是像素着色器效果不会应用于该控件 代码和 XAML 如下
  • 包含内容的 WPF 新窗口

    我想在现有的主 Windwoe 旁边创建一个带有可滚动文本框的新窗口 我在主窗口中按下 打开新窗口 按钮 然后它应该打开一个带有可滚动文本框的新窗口 inside form2 在 WPF 中 您可以在主窗口中拖放元素 但不能在新窗口中执行此
  • 如何将 Datagridview 中的格式列更改为该值的日期类型

    例如 我有这样的值 41607 2069444444 41607 2068402778 41607 2072222222 这是来自 CDR 的 dateTimeOrigination 计算 在 Excel 中 我将格式单元格更改为日期类型
  • 如何在 Binding Adapter 中将此 java 代码写入 kotlin

    我在 lang java 中的 onBindViewHolder 中编写了一些代码行 我试图在 Binding Adapter 中的 kotlin 中编写确切的代码 但我无法编写该代码 地震适配器 JAVA 我尝试过 但无法编写相同的代码来
  • 如何使用正则表达式验证带有可选百分比符号的小数?

    正如问题的标题 我需要使用以下值验证正则表达式 最多 2 个小数位和 9 个整数 带有可选的百分比符号 Valid 10 0 1111111 12 15 2 10 2 3 Invalid 12 02 123456789123 123 I t
  • WPF:如何避免图像超出 Canvas 的边界?

    我有一个画布作为图像查看器 它的背景用于放置图像 我想在其上面放置另一个图像 所以 场景是这样的
  • 列表框未使用绑定填充

    我正在尝试使用 mvvm 模式将现有程序转换为 c wpf 第一部分是选择要处理的文件的文件夹位置并填充列表框 我在这里找到了一个使用 Mvvm Light 的示例 WPF OpenFileDialog 与 MVVM 模式 https st
  • 确定最接近的已知颜色

    我允许我的应用程序的用户选择自定义颜色 并希望有一种方法来显示每种颜色的友好名称 而不是显示十六进制代码的文本表示形式 我如何找到最近的System Drawing Color对于给定的十六进制代码 希望这对某人有帮助 Public Fun
  • 当 AutoGenerateColumns = True 时如何重命名 DataGrid 列?

    我有一个简单的数据结构类 public class Client public String name set get public String claim number set get 我正在将其喂入DataGrid this data
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb

随机推荐

  • 测试它是 JSONObject 还是 JSONArray

    我有一个 json 流 可以是这样的 intervention id 3 subject dddd details dddd beginDate 2012 03 08T00 00 00 01 00 endDate 2012 03 18T00
  • 如何在pygame中从一种颜色淡入另一种颜色?

    我如何在 pygame 中从一种颜色淡入另一种颜色 我想慢慢地改变一个圆圈的颜色 从绿色到蓝色到紫色到粉色到红色到橙色到黄色到绿色 我该怎么做呢 目前 我正在使用 def colour switcher 0 0x2FD596 1 0x2FC
  • 自动附加支持行为未完全成功

    我有一个包含多个 C 项目的 Visual Studio 2010 解决方案 安装并启用了 Resharper 5 1 所有这些项目都以 NET Framework 4 为目标 该解决方案几个月来一直运行良好 但今天早上加载解决方案时我收到
  • ireport 4.0.1 中报表的动态宽度

    我在ireport4 0 1中设计了一个交叉表报表 由于交叉表 我不知道报告的宽度 是否有任何选项可以根据其包含的数据设置宽度 好吧 我的答案可能不是 jaspersoft 人员推荐的答案 但我要做的是在运行时计算所需的宽度 然后将值放入
  • 从 DataTemplate 上的按钮获取 ListBox 行对象

    我有一个ListBox with a DataTemplate 该模板有一个Button在上面 当 的时候Button单击我想对每行的对象执行一些逻辑 在本例中是一个名为WorkItemTypeMappings In theOnClick我
  • 是否可以检查您是否正在使用 Microsoft C 编译器构建 64 位版本?

    是否有为 64 位构建定义的简单预处理器宏 我想 WIN64可能是这样 但即使当我构建 32 位目标时 包含在 ifdef WIN64 endif被编译进去 这会引起问题 今天是星期五 我无法正常思考 但我确信我忽略了一些非常简单的事情 甚
  • 如何向rails4添加自定义动词(http请求方法)

    我想向 Rails 4 添加自定义 http VERB 这是我的路线 rb ring session gt calls ringing 我还将这段代码放入初始化程序中 w ring busy each do method ActionDis
  • CMake 排除子目录中的测试

    我有一个包含 libevent 库的 C 项目 项目结构 CMakeLists txt Makefile src my lib cpp test my lib test cpp lib libevent CMakeLists txt 当我构
  • 如何将线程异常传播回应用程序异常处理程序

    http msdn microsoft com en us magazine gg598924 aspx http msdn microsoft com en us magazine gg598924 aspx 为什么 WPF Dispat
  • 何时使用构建工具?

    一个初学者问题 请耐心等待 我只是想知道在什么情况下应该使用像 nant 或 msbuild 这样的构建工具 我正在开发一个中型应用程序 net 3 0 每个开发人员都在做他的工作并在他的机器上进行构建 检查他的代码更改到存储库中 全部完成
  • 对象未使用 JPA/JTA/JBOSS/CDI 持久化

    请帮助我理解为什么对象没有通过以下代码持久化 它抛出javax persistence TransactionRequiredException JBAS011469 需要事务来执行此操作 使用事务或扩展持久性上下文 public clas
  • 设置 3 个元素的高度,取最大值,跨多行

    我有一个 div 布局 全部向左浮动 列数为 3 这些层内部是长度不同的文本 因此层的高度不同 因此无法正确对齐 而且看起来也不太好 因为边框不身高匹配 我可以为所有 div 设置固定高度 但这会在某些行上留下巨大的空白 因此我编写了一些
  • Laravel:Redis 无法建立连接:[tcp://127.0.0.1:6379]

    我已经用 laravel 安装了 redis 添加了 predis predis 1 0 然后为了测试我添加了以下代码 public function showRedis id 1 user Redis get user profile i
  • Rails 4 和 Devise:Devise 不保存新信息(名字、姓氏、个人资料名称)

    我正在使用 Rails 4 和 Devise 我正在尝试在我的应用程序上发布的状态中显示用户的名字 我已经正确完成了我能想到的所有事情 添加用户模型后迁移数据库 并且数据库仍然没有保存我标题中列出的三个新字段 Devise 保存它附带的内容
  • kotlin,如何将 HashMap 放入 Parcelable 中

    在实现 Parcelable 的类中 它有一个 HashMap 成员 看到 Parcelable 有public final void readMap Map outVal ClassLoader loader 但找不到使用它的示例 如果通
  • 如何在不破坏皮肤的情况下向 MediaWiki 站点添加水平顶部菜单栏?

    我希望我的 MediaWiki 网站 除了侧边栏之外 或者代替侧边栏 在网站顶部有一个链接栏 在每个页面上都可见 要求 为了尽量减少以后的维护负担 我的要求是 无需修改核心 扩展或皮肤代码 我不想维护项目分支 理想情况下 特权用户应该能够通
  • WPF 可见性绑定到具有多个变量的布尔表达式

    我有两个布尔值 我想根据它们的值显示图像 如下所示
  • Java:将二进制字符串转换为十六进制字符串[重复]

    这个问题在这里已经有答案了 我需要将二进制字符串转换为十六进制字符串 但我有一个问题 我通过以下方法将二进制字符串转换为十六进制字符串 public static String binaryToHex String bin return L
  • Delphi - 按名称调用记录方法

    我为我的应用程序编写了一种脚本语言 我的目标是能够在脚本中发布来自 delphi 的任何类型 我使用 rtti 来自动执行此任务 对于任何实例类型 例如类 我使用以下代码从脚本查找并调用方法 var Info TRttiType Meth
  • WPF 用户控件数据绑定不起作用

    我正在创建一个简单的用户控件 将弹出窗口与文本视图相结合 这没什么疯狂的 当我首先在窗口中将其设置为全部样式时 它工作得很好 但是当我将其移到用户控件中以实际完成它时 它将不再正常工作 我将最小值和最大值传递给控件 然后它会自动创建一个数字