การผูก Image UriSource
ใน WPF ด้วย Data Binding: คู่มือที่ครอบคลุม
ในโลกของ WPF (Windows Presentation Foundation) การผูกข้อมูลอาจเป็นเรื่องที่ท้าทายบางครั้ง โดยเฉพาะเมื่อทำงานกับภาพ ปัญหาที่นักพัฒนามักพบคือการผูก UriSource
ของ Image
กับคุณสมบัติในรายการวัตถุที่กำหนดเอง หากคุณเคยพบข้อความแสดงข้อผิดพลาด “ต้องตั้งค่า ‘UriSource’ หรือ ‘StreamSource’” คุณไม่ได้อยู่คนเดียว มาสำรวจปัญหาและวิธีการแก้ไขกันในเชิงลึก
การทำความเข้าใจกับปัญหา
เมื่อคุณพยายามผูกแหล่งที่มาของ Image
ดังนี้:
<Image>
<Image.Source>
<BitmapImage UriSource="{Binding Path=ImagePath}" />
</Image.Source>
</Image>
คุณอาจคาดหวังว่าภาพจะแสดงขึ้น แต่กลับได้ข้อผิดพลาดที่ระบุว่าต้องตั้งค่าคุณสมบัติ ข้อผิดพลาดนี้มักเกิดขึ้นเนื่องจาก WPF ต้องการให้คุณสมบัติ Source
ถูกตั้งค่าอย่างถูกต้อง และสามารถแปลงประเภทบางประเภทโดยอัตโนมัติ ซึ่งเราจะพูดถึงในเร็วๆ นี้
วิธีการแก้ไข: การทำให้การผูกภาพง่ายขึ้น
การใช้คุณสมบัติ Source โดยตรง
WPF มีตัวแปลงในตัวเพื่อทำให้กระบวนการผูกแหล่งที่มาของภาพง่ายขึ้น แทนที่จะต้องกำหนด Image.Source
ด้วย BitmapImage
อย่างชัดเจน คุณสามารถผูกคุณสมบัติ Source
ของ Image
โดยตรง ดังนี้:
<Image Source="{Binding ImageSource}"/>
ในกรณีนี้ คุณสมบัติ ImageSource
ใน view model ของคุณควรเป็น string
ที่แทน URI ที่ถูกต้องสำหรับภาพ ตัวแปลง ImageSourceConverter
ของ WPF จะจัดการการแปลงจาก string
เป็น ImageSource
ให้คุณโดยอัตโนมัติ
การสร้างตัวแปลงค่าที่กำหนดเอง
หากคุณต้องการความยืดหยุ่นมากขึ้น หรือหากแหล่งที่มาของคุณไม่ให้ URI สตริงได้ง่าย คุณสามารถสร้างตัวแปลงค่าที่กำหนดเอง มาเริ่มต้นกันที่ตัวอย่างง่ายๆ ของการสร้าง ImageConverter
:
public class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return new BitmapImage(new Uri(value.ToString()));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
การนำตัวแปลงมาใช้ใน XAML
เมื่อคุณสร้าง ImageConverter
เสร็จสิ้น คุณสามารถใช้มันโดยตรงใน XAML binding ตามด้านล่างนี้:
<Image Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"/>
สรุป
สรุปแล้ว เมื่อต้องการผูก UriSource
ของภาพใน WPF คุณมีสองตัวเลือกหลัก:
- ใช้คุณสมบัติ
Source
โดยตรง ด้วยการแทนที่ด้วยstring
ที่เป็นตัวแทน URI ที่ถูกต้อง ซึ่งทำให้ WPF จัดการการแปลงให้กับคุณ - สร้างตัวแปลงที่กำหนดเอง เพื่อแปลงประเภทอื่นๆ เป็น
BitmapImage
หากจำเป็น
โดยการทำความเข้าใจและนำแนวคิดเหล่านี้ไปใช้ คุณจะสามารถผูกภาพใน WPF ได้อย่างมีประสิทธิภาพโดยไม่พบกับปัญหาหรือข้อผิดพลาดทั่วไป โชคดีในการเขียนโค้ด!