0

저는 Winforms에 익숙한 사용자이며 현재 WPF로 게임하고 있지만 조금 힘들어하고 있습니다. 2 개의 열이있는 DataGrid가 있습니다. 첫 번째 열은 내 개체의 "Name"속성에 바인딩 된 DataGridTextColumn입니다. 두 번째 열은 내 개체의 "전원"속성에 바인딩됩니다.DataGrid의 ComboBox를 다른 열의 값으로 채우기

사용자가 전원 열을 편집 할 때 첫 번째 항목의 "없음"외에도 첫 번째 열의 모든 이름을 나열하는 콤보 상자를 표시하려고합니다. 어떻게하면됩니까?

또한 사용자가 첫 번째 열의 이름을 업데이트하면 변경 내용이 전원 열에 반영됩니다. 가능한가? XAML에서

public partial class MainWindow : Window 
{ 
    ObservableCollection<MyObject> objects = new ObservableCollection<MyObject>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     dgObjects.ItemsSource = objects; 
    } 
} 

public class MyObject 
{ 
    public String Name { get; set; } 
    public String Power { get; set; } 
} 

: 뒤에 코드에서

<DataGrid Name="dgObjects" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
     <DataGridComboBoxColumn Header="Power" Binding="????"/> 
    </DataGrid.Columns> 
</DataGrid> 

감사

+0

당신은 설정하고자 및 변경하여 해당 컬렉션에'ComboBox.ItemsSource'을 결합 후 일반적으로 데이터 그리드를 바인딩하는 항목의 컬렉션을 포함하는 것과 동일한 수준에서, 다른 곳에서 컬렉션을 유지하고' 소스 '바인딩. 가장 일반적인 시나리오에서'RelativeSource' 바인딩은 부모'DataGrid'를 찾고'DataGrid.DataContext.SomeCollection'에 바인드하는 데 사용됩니다. 예를 들어'ItemsSource = "{Binding DataContext.PowerValues, RelativeSource = {RelativeSource AncestorType = {x : Type DataGrid}}" " – Rachel

답변

0

당신은 DataContext에 바인딩을 통해이 작업을 수행 할 수 있습니다. 하지만 먼저 Window의 DataContext을 올바르게 설정해야합니다. ItemsSource은 코드 숨김을 통해 수행하면 안됩니다 (WPF, 바인딩 사용!). 당신의 XAML을 업데이트 지금

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

    public class ViewModel 
    { 
     public ObservableCollection<MyObject> Objects { get; } = new ObservableCollection<MyObject>(); 

     public ViewModel() 
     { 
      Objects.Add(new MyObject 
      { 
       Name = "Name" 
      }); 
      Objects.Add(new MyObject 
      { 
       Name = "Name2" 
      }); 
      Objects.Add(new MyObject 
      { 
       Name = "Name3" 
      }); 
     } 
    } 

    public class MyObject 
    { 
     public String Name { get; set; } 
     public String Power { get; set; } 
    } 

:

는 같은 클래스 구조를 설정합니다. CellTemplateCombobox 표준을 사용해야합니다. ComboBox은 Objects 컬렉션에 바인딩하고 Name을 표시하지만 Power에 값을 설정합니다.

<Window x:Class="WpfApplication8.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     x:Name="MyWindow"> 
    <Grid> 
     <DataGrid Name="dgObjects" AutoGenerateColumns="False" 
        ItemsSource="{Binding Objects}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox ItemsSource="{Binding ElementName=MyWindow, Path=DataContext.Objects}" 
             DisplayMemberPath="Name" 
             SelectedItem="{Binding Power}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 
+0

그래, 나는'RelativeSource' 바인딩을 사용하기를 원한다. UI 계층 구조에 따라 'ElementName'대신 'ElementName'이 사용됩니다. – Rachel

+0

@Rachel은 RelativeSource를 사용하는 것보다 성능 문제/이점이 있습니까? –

+0

비주얼 트리를 트래버스하는 대신 ElementName을 사용하는 것이 더 빠를 수도 있지만, 문제가 될 정도로 충분하지 않다고 생각합니다. 나는 우리가 검색하면 누군가가 온라인으로 어딘가에 몇 가지 테스트를 완료했다고 확신합니다 :) – Rachel

관련 문제