WPF XAML 需將 CLR 命名空間/組件映射為 XML 命名空間,才能在標記中引用自定義類型。本文修正書中過時 `
<!-- 根元素 Window/Page/UserControl -->
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataBindingDemo"> <!-- 關鍵映射 -->
...
</Window>
clr-namespace: 固定前綴,後接 CLR 命名空間名。xmlns:lib="clr-namespace:MyLib;assembly=MyLib"。namespace DataBindingDemo {
public class Nickname {
public string Name { get; set; }
public string Nick { get; set; }
}
public class Nicknames : ObservableCollection<Nickname> { } // 強類型集合
}
<Window.Resources>
<local:Nicknames x:Key="XX"> <!-- 建立集合實例,Key="XX" -->
<local:Nickname Name="Don" Nick="Naked" />
<local:Nickname Name="Martin" Nick="Gudge" />
<local:Nickname Name="Tim" Nick="Stinky" />
</local:Nicknames>
</Window.Resources>
關鍵:`
<DockPanel DataContext="{StaticResource XX}"> <!-- 直接綁定資源實例 -->
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center">Name: </TextBlock>
<TextBox Text="{Binding Path=Name}" /> <!-- 綁定當前項目 Name -->
<TextBlock VerticalAlignment="Center">Nick: </TextBlock>
<TextBox Text="{Binding Path=Nick}" />
</StackPanel>
<Button DockPanel.Dock="Bottom" x:Name="addButton">Add</Button>
<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock Text="{Binding Path=Name}" />:
<TextBlock Text="{Binding Path=Nick}" />
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
public partial class Window1 : Window {
private Nicknames names;
public Window1() {
InitializeComponent();
this.addButton.Click += addButton_Click;
// 從資源字典獲取同一實例,供後台邏輯操作 (如 Add)
this.names = (Nicknames)this.FindResource("XX");
// 無需再設定 dockPanel.DataContext,XAML 已綁定
}
void addButton_Click(...) { names.Add(new Nickname { Name = "...", Nick = "..." }); }
}

圖示核心:
CLR Namespace (`DataBindingDemo`) ←映射→ XML Namespace (`local:`) ←使用→ XAML Elements (`
在組件 `AssemblyInfo.cs` 添加:
[assembly: XmlnsDefinition("https://schemas.my.com/ui", "MyNamespace")]
則可在 XAML 直接用 `
掌握 `clr-namespace` 映射,是讓自定義類型進入 XAML 宣告式世界的大門。