programing

WPF의 XAML에서 데이터 컨텍스트 설정

javamemo 2023. 5. 25. 21:22
반응형

WPF의 XAML에서 데이터 컨텍스트 설정

다음 코드가 있습니다.

주 창.xaml

<Window x:Class="SampleApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding Employee}">
    <Grid>       
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="200" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="ID:"/>
        <Label Grid.Row="1" Grid.Column="0" Content="Name:"/>
        <TextBox Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding EmpID}" />
        <TextBox Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding EmpName}" /> 
    </Grid>
</Window>

Employee.cs

namespace SampleApplication
{
    public class Employee
    {
        public Employee()
        {
            EmployeeDetails employeeDetails = new EmployeeDetails();
            employeeDetails.EmpID = 123;
            employeeDetails.EmpName = "ABC";
        }
    }

    public class EmployeeDetails
    {
        private int empID;
        public int EmpID
        {
            get
            {
                return empID;
            }
            set
            {
                empID = value;
            }
        }

        private string empName;
        public string EmpName
        {
            get
            {
                return empName;
            }
            set
            {
                empName = value;
            }
        }
    }
}

이것은 매우 간단한 코드이고 나는 단지 바인딩을 원합니다.EmpID그리고.EmpNameEmployee.cs 클래스의 속성을 MainWindow.xaml에 있는 텍스트 상자의 텍스트 속성으로 표시하지만 코드를 실행할 때 이 텍스트 상자에는 아무것도 표시되지 않습니다.제본이 맞습니까?

이 코드는 항상 실패합니다.

작성된 대로 "내 DataContext 속성에서 "Employee"라는 속성을 찾아 DataContext 속성으로 설정하십시오."라고 표시됩니다.분명히 그것은 옳지 않습니다.

코드를 그대로 작동시키려면 창 선언을 다음으로 변경합니다.

<Window x:Class="SampleApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SampleApplication"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
   <local:Employee/>
</Window.DataContext>

새 XAML 네임스페이스(로컬)를 선언하고 DataContext를 Employee 클래스의 인스턴스로 설정합니다.이렇게 하면 바인딩에 생성자의 기본 데이터가 표시됩니다.

그러나 이것이 실제로 당신이 원하는 것일 가능성은 매우 낮습니다.대신, MainViewModel이라고 하는 새로운 클래스가 있어야 합니다.Employee다음과 같이 바인딩할 속성:

public class MainViewModel
{
   public Employee MyEmployee { get; set; } //In reality this should utilize INotifyPropertyChanged!
}

이제 XAML은 다음과 같습니다.

<Window x:Class="SampleApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SampleApplication"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
       <local:MainViewModel/>
    </Window.DataContext>
    ...
    <TextBox Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding MyEmployee.EmpID}" />
    <TextBox Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding MyEmployee.EmpName}" />

이제 다른 속성(다른 유형, 이름 등)을 추가할 수 있습니다.자세한 내용은 모델-뷰-뷰 모델 패턴 구현을 참조하십시오.

우선 직원 세부 정보가 포함된 속성을 생성해야 합니다.Employee클래스:

public class Employee
{
    public Employee()
    {
        EmployeeDetails = new EmployeeDetails();
        EmployeeDetails.EmpID = 123;
        EmployeeDetails.EmpName = "ABC";
    }

    public EmployeeDetails EmployeeDetails { get; set; }
}

그렇지 않으면 다음에 개체 인스턴스를 만듭니다.Employee생성자에 대한 참조가 사라집니다.

XAML에서 다음의 인스턴스를 생성해야 합니다.Employee클래스, 그리고 그 후에 당신은 그것을 할당할 수 있습니다.DataContext.

XAML은 다음과 같아야 합니다.

<Window x:Class="SampleApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:local="clr-namespace:SampleApplication"
   >
    <Window.Resources>
        <local:Employee x:Key="Employee" />
    </Window.Resources>
    <Grid DataContext="{StaticResource Employee}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="200" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="ID:"/>
        <Label Grid.Row="1" Grid.Column="0" Content="Name:"/>
        <TextBox Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding EmployeeDetails.EmpID}" />
        <TextBox Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding EmployeeDetails.EmpName}" />
    </Grid>
</Window>

이제 직원 세부 정보가 포함된 속성을 만든 후 이 속성을 사용하여 바인딩해야 합니다.

Text="{Binding EmployeeDetails.EmpID}"

여기에는 몇 가지 문제가 있습니다.

  1. 데이터 컨텍스트를 다음과 같이 할당할 수 없습니다.DataContext="{Binding Employee}"문자열로 할당할 수 없는 복잡한 개체이기 때문입니다.그래서 당신은 사용해야 합니다.<Window.DataContext></Window.DataContext>통사론
  2. 데이터 컨텍스트 개체를 나타내는 클래스를 개별 속성이 아닌 뷰에 할당합니다.{Binding Employee}여기서는 유효하지 않습니다. 개체를 지정하면 됩니다.
  3. 이제 아래와 같이 유효한 구문을 사용하여 데이터 컨텍스트를 할당할 수 있습니다.
   <Window.DataContext>
      <local:Employee/>
   </Window.DataContext>

Employee 클래스의 새 인스턴스를 만들고 이 인스턴스를 데이터 컨텍스트 개체로 할당합니다.기본 생성자에 아무것도 없을 수 있으므로 아무것도 표시되지 않습니다.그렇다면 파일 뒤에 있는 코드로 어떻게 관리합니까?데이터 컨텍스트를 입력했습니다.

    private void my_button_Click(object sender, RoutedEventArgs e)
    {
        Employee e = (Employee) DataContext;
    }
  1. 두 번째 방법은 파일 자체 뒤에 있는 코드에 데이터 컨텍스트를 할당하는 것입니다.그 다음 장점은 파일 뒤에 있는 코드가 이미 알고 있고 파일과 함께 작동할 수 있다는 것입니다.

    public partial class MainWindow : Window
    {
       Employee employee = new Employee();
    
       public MainWindow()
       {
           InitializeComponent();
    
           DataContext = employee;
       }
    }
    

언급URL : https://stackoverflow.com/questions/23713898/setting-datacontext-in-xaml-in-wpf

반응형