Tags:

คือผมลองเล่น WPF ดูอ่ะครับ แล้วทีนี้ผมเกิดความสงสัยแบบสุดๆครับว่า ในเมื่อโปรแกรมกับส่วนแสดงผลแยกกัน ทีนี้ถ้าเกิดว่าผมต้องการปรับค่าการแสดงผลจาก Main Program ได้นี่มันต้องทำอย่างไรหรอครับ เช่นใน xaml มี TextBlock สูง 200 แต่ผมต้องการที่จะเปลี่ยนค่าความกว้างของมันได้อย่างอิสระจากการคำนวณใน Main Program โดยป้อนค่าตัวเลขที่ต้องการลงใน textbox อะไรแบบนี้อ่ะครับ มันต้องทำยังไงหรอครับ..

Get latest news from Blognone
By: varavut
ContributorWindows PhoneAndroidBlackberry
on 28 May 2012 - 17:33 #424986

ก็ Binding ตามปกติเลยครับ แต่ถ้าจะให้มันเอาค่าจาก TextBox กลับไปด้วยต้องกำหนดเป็น TwoWay เพื่อบอกว่าค่าในนี้หากมีการกำหนดที่ UI ให้ไปแก้ค่าที่ DataContext ด้วย

เช่น

<TextBox Height="72" Width="{Binding Width1}" HorizontalAlignment="Left" Margin="12,65,0,0" Name="textBox1" Text="{Binding Width1,Mode=TwoWay}" VerticalAlignment="Top" />

ปล. อันนี้ผมเขียนเป็นของ WP7 นะครับ ไม่รู้ว่าจะเหมือนกันไหม


2bedev.com เขียนโปรแกรมระดับรากหญ้า

By: livebox
Windows
on 28 May 2012 - 19:05 #425007

คือตอนนี้ผม Binding เป็นแค่ [กำหนด ElementName แล้วก็ Path ]ให้ชี้ค่าไปที่ ElementName นั้นๆใน xaml เองอ่ะครับ ทีนี้ผมก็เลยสงสัยว่า ถ้าเกิดจะให้มันชี้ไปเอาค่าใน mian program อ่ะครับ มันจะต้องทำยังไง

เช่นใน Windows ผมมี Button1 อยู่ปุ่มนึง แล้วก็มี TextBlock1 อยู่หนึ่งตัว สูง 200 แต่ความกว้างผมจะไปเอาที่ main program โดยที่ตอนที่โปรแกรมโหลดขึ้นมาผมกำหนดค่าเริ่มต้นให้ความกว้างของ TextBlock1 เป็น 100 แล้วคำสั่งภายในปุ่มผมคือกำหนดให้ความกว้างของ TextBlock1 นั้นเป็น 300 อะไรแบบนี้อ่ะครับ แบบว่าผมอยากจะทำแบบนี้อ่ะครับ ไม่ทราบว่าทำอย่างไร รบกวนช่วยลองเขียน Code xaml กับ C#หรือVB ให้ดูเป็นตัวอย่างหน่อยสิครับ ขอบคุณล่วงหน้าครับผม..

By: varavut
ContributorWindows PhoneAndroidBlackberry
on 28 May 2012 - 20:16 #425029

public partial class MainPage : PhoneApplicationPage, INotifyPropertyChanged

{
//ค่า width ที่จะใช้กำหนดให้ element

private int _width = 250;

//สร้าง setter getter ให้ตัวแปร _width ชื่อว่า Width1

public int Width1

{

get { return _width; }//คืนค่าของ _width เมื่อมีการเรียกใช้

set

{

_width = value; //กำหนดค่าใหม่ให้ _width

NotifyPropertyChanged("Width1"); //แจ้งให้ UI ทราบว่ามีการเปลี่ยนแปลง

ค่าแล้ว
}

}

//event สำหรับแจ้งเวลามีการเปลี่ยนแปลงค่า

public event PropertyChangedEventHandler PropertyChanged;

//สร้างเป็น method ให้เรียกใช้ง่ายๆ

private void NotifyPropertyChanged(String info)

{

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(info));

}

}

// Constructor

public MainPage()

{

InitializeComponent();

this.DataContext = this; //กำหนดว่า data ที่จะ binding นั้นคือ object ก้อนนี้

}

}

ใช้xaml ใน comment แรกนะครับ
เวลาจะเปลี่ยนค่าก็สั่งแค่ Width1 = ค่าที่ต้องการ มันก็จะ Binding เองเลยครับ
อันนี้เป็นของ WP7 แต่คิดว่าก็น่าจะคล้ายๆกัน


2bedev.com เขียนโปรแกรมระดับรากหญ้า

By: livebox
Windows
on 28 May 2012 - 22:54 #425083 Reply to:425029

โว้วว ขอบคุณมากๆครับ แล้วถ้าเกิดจะเปลี่ยนแปลงค่าความกว้างของตัว Control ที่มันอยู่ใน DataTemplate มันจะต้องทำอย่างไรหรอครับ..

By: varavut
ContributorWindows PhoneAndroidBlackberry
on 29 May 2012 - 15:34 #425417 Reply to:425083

แล้วใช้วิธีเดียวกันนี้ไม่ได้หรอครับ ผมก็ไม่เคยลองเหมือนกัน


2bedev.com เขียนโปรแกรมระดับรากหญ้า

By: livebox
Windows
on 29 May 2012 - 17:14 #425453 Reply to:425417

ครับผม ผมลองดูแล้ว แบบว่า ของที่อยู่ใน DataTemplate มันเชื่อมต่อไปไม่ถึง Width1 ได้เลยอ่ะครับ แต่มันสามารถ Binding ไปหา Element ข้างนอก DataTemplate ใน xaml ได้อ่ะครับ