Avalonia UI
首页支持GitHub 仓库English Doc
  • 👋欢迎
  • 文档
    • ⚡快速开始
      • IDE 支持
        • JetBrains Rider 设置
      • 使用 Avalonia 开发
        • Model-View-ViewModel 模式(MVVM)
        • 控件和布局
        • 数据绑定
        • 图像和动画
      • Windows
      • UserControls
      • 资产
      • 开发者工具
      • 错误和警告日志
      • 未处理的异常
      • 应用生命周期
    • 🔁数据绑定
      • 数据上下文
      • 变化通知
      • 绑定
      • 编译绑定
      • 与控件绑定
      • 转换绑定值
      • 绑定到命令
      • 绑定到任务和可观察对象
      • 使用代码进行绑定
      • 在控件模板中实现绑定
      • 绑定Classes
      • 创建和绑定到附加属性
      • Data Validation
    • 🎨样式
      • 样式
      • 选择器
      • 资源
      • 疑难解答
    • 🧰控件
      • AutoCompleteBox
      • Border
      • Buttons
        • Button
        • RepeatButton
        • RadioButton
        • ToggleButton
        • ButtonSpinner
        • SplitButton
        • ToggleSplitButton
      • Calendar
      • Canvas
      • Carousel
      • CheckBox
      • ComboBox
      • ContentControl
      • ContextMenu
      • Decorator
      • DataGrid
        • DataGridColumns
      • DatePicker
      • DockPanel
      • Expander
      • Flyouts
      • Grid
      • GridSplitter
      • Image
      • ItemsControl
      • ItemsRepeater
      • LayoutTransformControl
      • ListBox
      • MaskedTextBox
      • Menu
      • NativeMenu
      • NumericUpDown
      • Panel
      • ProgressBar
      • RelativePanel
      • ScrollBar
      • ScrollViewer
      • Separator
      • Slider
      • SplitView
      • StackPanel
      • TabControl
      • TabStrip
      • TextBlock
      • TrayIcon
      • TreeDataGrid
        • Creating a Hierarchical TreeDataGrid
        • Creating a Flat TreeDataGrid
        • TreeDataGrid column types
      • TimePicker
      • TextBox
      • ToolTip
      • TreeView
      • TransitioningContentControl
      • UserControl
      • Viewbox
      • Window
      • WrapPanel
    • 📚模板
      • 数据模板
      • 在代码中创建数据模板
      • 实现 IDataTemplate 接口
    • ✏️自定义控件
      • 控件类别
      • 定义属性
    • 🖱️输入
      • 路由事件
      • 剪贴板
      • 鼠标与触控设备
      • 快捷键
    • 🔑动画
      • 关键帧动画
      • 过渡
      • 页面过渡
    • 📐布局
      • 面板概述
      • Alignment、Margin 和 Padding
      • 创建自定义面板
    • 📦发布/分发
      • macOS
  • API 参考
    • 🗒️命名空间
      • Avalonia
      • Avalonia.Animation
        • Avalonia.Animation.Easings
        • Avalonia.Animation.Animators
      • Avalonia.Collections
      • Avalonia.Controls
      • Avalonia.Data
        • Avalonia.Data.Core.Plugins
        • Avalonia.Data.Core
        • Avalonia.Data.Converters
      • Avalonia.Diagnostics
      • Avalonia.Dialogs
  • 指南
    • 🐣基础
      • XAML 介绍
      • Code-behind
      • MVVM 架构
      • 在UI线程上操作
    • 🤿深入
      • 在树莓派上运行你的应用
      • 在树莓派上运行你的应用(使用Raspbian Lite)
      • ReactiveUI
        • 视图激活机制
        • 路由
        • 数据持久化
        • 绑定到 Sorted/Filtered 数据
    • 👩‍💻👩💻 开发人员指南
      • 🏭从源代码中构建 Avalonia
      • Avalonia 与 WPF 和 UWP 之间的比较
      • Debugging Previewer
      • Debugging the XAML compiler
      • macOS 开发
      • Release Process
      • 维护稳定的分支
  • 教程
    • 📋待办事项应用
    • 📻音乐商店应用
    • 🕸️在浏览器中运行
    • 📱为移动设备开发
  • 杂项
    • 👪社区
    • 🖥️WPF 开发者建议
    • 📋正在使用 Avalonia 的项目
    • ❔常见问题
由 GitBook 提供支持
在本页
  • 绑定路径
  • 绑定模式
  • 格式字符串
  • 范例

这有帮助吗?

在GitHub上编辑
  1. 文档
  2. 数据绑定

绑定

上一页变化通知下一页编译绑定

最后更新于2年前

这有帮助吗?

你可以使用{Binding}标记拓展在XAML中进行绑定。通过绑定,所有数据上下文(假设你已经为其实现了)的变化都将自动更新到控件上。

绑定默认是。例如:

<!-- 绑定 TextBlock 的 DataContext.Name 属性 -->
<TextBlock Text="{Binding Name}"/>

<!-- 如下等同 ('Path' 是可选的) -->
<TextBlock Text="{Binding Path=Name}"/>

空白的绑定是绑定在DataContext本身

<!-- 绑定至 TextBlock 的 DataContext 属性 -->
<TextBlock Text="{Binding}"/>

<!-- 等同如下 -->
<TextBlock Text="{Binding .}"/>

我们将控件的属性称为绑定的 目标,而DataContext的属性称为绑定的 源

绑定路径

绑定的路径可以是一个属性,也可以是连续调用的一串属性。例如,如果DataContext所赋值有Student属性,而这个属性的值有Name属性,那么你可以用如下方法绑定学生的名字:

<TextBlock Text="{Binding Student.Name}"/>

你还可以在绑定路径中使用列表或数组的索引器

<TextBlock Text="{Binding Students[0].Name}"/>

绑定模式

你可以通过指定{Binding}的Mode来修改绑定的行为:

<TextBlock Text="{Binding Name, Mode=OneTime}">

可用的绑定模式包括:

模式
详情

OneWay

源的变化自动传播到目标

TwoWay

源和目标的变化互相传播

OneTime

源的初始值会应用到目标,但后续的变化会被无视

OneWayToSource

目标的变化自动传播到源

Default

依据属性而定

如果没有设定模式,则默认为Default模式。通常情况下如果控件属性不需要相应用户输入则是OneWay(例如TextBlock.Text);如果需要依用户输入而变则是TwoWay(例如TextBox.Text)。

格式字符串

你可以为绑定设置格式字符串,从而影响在UI上如何展现值:

<!-- 选项 1: 使用花括号对格式字符串进行转义 -->
<TextBlock Text="{Binding FloatValue, StringFormat={}{0:0.0}}" />

<!-- 选项 2: 使用反斜线对格式字符串进行转义 -->
<TextBlock Text="{Binding FloatValue, StringFormat=\{0:0.0\}}" />

<!-- 选项 3: 如果格式字符串并非以{0}开始,则不需要转义 -->
<!-- 注意:如果在格式字符串中存在空格,则需要用单引号''包裹起来 -->
<TextBlock Text="{Binding Animals.Count, StringFormat='I have {0} animals.'}" />
<!-- 注意: 如果格式字符串以{0}开始则需要转义,例如:-->
<TextBlock Text="{Binding Animals.Count, StringFormat='{}{0} animals live in the farm.'}" />

当StringFormat属性存在时,绑定的值将会由StringFormatValueConverter利用指定的格式字符串进行转换。

与WPF不同,你需要将格式字符串用花括号包裹起来并以0:开始({0:TheStringFormat})。如果格式字符串中花括号出现在开始,那么即使用单引号包裹起来,也需要进行转义。可以在前面加{},也可以使用反斜线\{...\}:

WPF:

<TextBlock Text="{Binding FloatValue, StringFormat=0.0}" />

Avalonia:

<TextBlock Text="{Binding FloatValue, StringFormat={}{0:0.0}}" />
<TextBlock Text="{Binding FloatValue, StringFormat=\{0:0.0\}}" />
<TextBlock Text="{Binding FloatValue, StringFormat='{}{0:0.0}'}" />

范例

格式字符串详情请阅读

🔁
变化通知
DataContext的属性
微软文档
Basic MVVM Sample