2011-02-17 3 views
1

XAML 또는 ViewModel에서 DataGrid에 셀 포커스를 설정하려고합니다.xaml 또는 ViewModel의 행에 포커스를 설정하십시오.

속성이 SelectedItem으로 바인딩되어 있습니다. 바운드 속성은 그리드에서 선택이 변경되고 셀에 포커스가있을 때 업데이트됩니다. 그러나 뷰 모델에서 SelectedItem을 변경하면 행이 셀이 아닌 포커스가됩니다.

SelectedItem이 변경되면 어떻게 셀을 포커스 할 수 있습니까?

이것을 XAML 올바른 항목을 선택할 수 난 그냥 데이터 그리드에 필요한

<DataGrid SelectedItem="{Binding SelectedHotel}" ItemsSource="{Binding HotelsList}" AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserAddRows="False"> 
       <DataGrid.Columns> 
        <DataGridTemplateColumn Width="350" Header="Hotel" d:IsLocked="True"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <Label Content="{Binding Name}"></Label> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 

         <DataGridTemplateColumn.CellEditingTemplate> 
          <DataTemplate> 
           <Grid> 
            <TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox> 
           </Grid> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellEditingTemplate> 


        </DataGridTemplateColumn> 


        <DataGridTemplateColumn Header=""> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <Grid> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="*" /> 
            </Grid.RowDefinitions> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="*" /> 
             <ColumnDefinition Width="*" /> 
            </Grid.ColumnDefinitions> 
            <Button Content="Save" Command="{Binding DataContext.SaveEditsCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
            <Button Grid.Column="1" Content="Delete" Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
           </Grid> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
       </DataGrid.Columns> 
      </DataGrid> 

. 목록의 항목을 클릭하면이 항목에 배경색이 적용됩니다. 이 동작을 프로그래밍 방식으로 설명하려고합니다.

감사

답변

0

다음 코드는 코드에서의 selectedItem을 설정할 수 있습니다 및 사용자가 그리드에서 행을 선택할 때 그것은 또한 업데이트됩니다. 이게 너가 한 일이야, 그렇지 않다면 너는 너의 질문을 확장 할 수 있니?

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private ObservableCollection<Hotel> _hotelsList; 
    private Hotel _selectedHotel; 

    public ObservableCollection<Hotel> HotelsList 
    { 
     get { return _hotelsList; } 
     set 
     { 
      if (_hotelsList == value) 
       return; 

      _hotelsList = value; 
      OnPropertyChanged("HotelsList"); 
     } 
    } 

    public Hotel SelectedHotel 
    { 
     get { return _selectedHotel; } 
     set 
     { 
      if (_selectedHotel == value) 
       return; 

      _selectedHotel = value; 
      OnPropertyChanged("SelectedHotel"); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 

     var hotels = new ObservableCollection<Hotel>(); 
     hotels.Add(new Hotel { Name = "Royal Bath" }); 
     hotels.Add(new Hotel { Name = "Royal Norfolk" }); 
     hotels.Add(new Hotel { Name = "Hilton" }); 
     HotelsList = hotels; 
     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     SelectedHotel = HotelsList[1]; 
     DataGridCell cell = GetCell(myGrid, 1, 0); 
     cell.Focus(); 
    } 

    public DataGridCell GetCell(DataGrid grid, int row, int column) 
    { 
     DataGridRow rowContainer = GetRow(grid, row); 

     if (rowContainer != null) 
     { 
      DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); 

      // try to get the cell but it may possibly be virtualized 
      DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      if (cell == null) 
      { 
       // now try to bring into view and retreive the cell 
       grid.ScrollIntoView(rowContainer, grid.Columns[column]); 
       cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      } 
      return cell; 
     } 
     return null; 
    } 

    public DataGridRow GetRow(DataGrid grid, int index) 
    { 
     DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
     if (row == null) 
     { 
      // may be virtualized, bring into view and try again 
      grid.ScrollIntoView(grid.Items[index]); 
      row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
     } 
     return row; 
    } 

    public static T GetVisualChild<T>(Visual parent) where T : Visual 
    { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
      Visual v = (Visual) VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) 
      { 
       child = GetVisualChild<T>(v); 
      } 
      if (child != null) 
      { 
       break; 
      } 
     } 
     return child; 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class Hotel : INotifyPropertyChanged 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name == value) 
       return; 

      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

내 질문이 확장되었습니다. 당신의 대답은 이미했던 것과 동일하지만, UI에서 행동하지 않았습니다. – StrouMfios

+0

@StrouMfios updated 대답 –

관련 문제