Trong C# WPF thì DataContext là gì?

Hi cả nhà, em mới tìm hiểu một chút về C# có làm quen với DataContext. Em chưa thực sự hiểu sâu về vấn đề này say một hồi tìm hiểu trên mạng.Ai có thể giải thích giùm em hiểu được không ạ? Em cảm ơn

DataContext là nguồn dữ lieu mặc định cho việc binding dữ liệu trong WPF.

Trong câu lệnh binding thông thường cần xác định element và Path để thực hiện binding.
<Label Content="{Binding ElementName=object, Path=propertyName}"/>

Tuy nhiên trong nhiều trường hợp sẽ viết như sau:
<Label Content="{Binding propertyName}"/>

Thì trong trường hợp này không xác định rõ dữ lieu nên nó sẽ ngầm hiểu đang thực hiện binding đến propertyName của DataContext.

Bây giờ nếu set DataContext là loại dữ liệu có property tên là propertyName thì binding được xác lập và Label hiển thị giá trị của propertyName.

3 Likes

Data context is a concept where objects can inherit data binding information from successive parent objects in an object relationship hierarchy.

Để hiểu khái niệm này trước tiên bạn cần hiểu về data binding đã.
VD: Chú ý cái button với event click của nó
xaml

 <ListBox ItemSource="{Binding AListOfMyClassObject}">
    <ListBox.ItemTemplate>
        <DataTemplate >
            <Grid HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Button Grid.Column="0" Name="btTag"  VerticalAlignment="Center" Click="btTag_Click" HorizontalAlignment="Left">
                </Button>
                <TextBlock Margin="5" Grid.Column="1" Text="{Binding Name}" />  
                <TextBox Margin="5" Grid.Column="2" Text="{Binding Value, Mode=TwoWay}" />                                        
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

C#


void btTag_Click (sender s, eventHandle e) //các argument có thể khác.
{
    var whatObject = (s as Button).DataContext as MyClass;
// Gỉa sử bạn đang bind tới data thuộc class MyClass;
    MessageBox.Show($"Bạn đang lấy thông tin của Object có tên là {whatObject.Name} có giá trị là {whatObject.Value}");
// Trong hàm Windows.Initialize() khai báo this.DataContext = this. 
// để quá trình compile xaml biết được đang sử dụng ngữ cảnh nào cho listview.
}
2 Likes

Chuyện gì sẽ xảy ra nếu set DataContext cho object không có propertyName. Ví dụ this.DataContext = new People(“Nguyen Van A”, 21); khi Binding thì ta lại Binding một thuộc tính không có của people?

Không có khi binding đó được gọi sẽ văng exception trong lúc runtime.

Mình vừa thử rồi nha. Không có Exception nếu đổi tên propertyName trong XAML

Bạn kiểm tra trong output nhé, nó sẽ có error là trong class đó ko chưa property đó, và ko binding được. Nó ko văng exception, nhầm :slight_smile:

Không có error luôn bạn ạ

Nếu DataContext không có propertyName thì không binding được. Binding nó sẽ không hoạt động.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?