मैं एक्सएएमएल या व्यूमोडेल से डेटाग्रिड पर सेल फोकस सेट करने का प्रयास कर रहा हूं।

मेरे पास एक संपत्ति है जो चयनित इटैम के रूप में बाध्य है। ग्रिड पर चयन बदलते समय बाध्य संपत्ति अपडेट की जाती है और सेल केंद्रित होता है, हालांकि जब मैं अपने व्यू मॉडल में चयनित इटैम को बदलता हूं तो पंक्ति सेल की बजाय केंद्रित होती है।

जब चयनित इटैम बदल जाता है तो मैं इसे सेल पर ध्यान केंद्रित करने के लिए कैसे प्राप्त कर सकता हूं?

यह एक्सएएमएल

<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>

मुझे सही आइटम का चयन करने के लिए बस डेटाग्रिड में चाहिए। जब आप सूची के किसी आइटम पर क्लिक करते हैं, तो यह आइटम एक पृष्ठभूमि रंग प्राप्त करता है। मैं इस व्यवहार को प्रोग्रामेटिक रूप से चित्रित करने की कोशिश कर रहा हूं।

धन्यवाद

1
profanis 17 फरवरी 2011, 13:35

1 उत्तर

सबसे बढ़िया उत्तर

निम्नलिखित कोड आपको कोड में एक चयनित इटैम सेट करने की अनुमति देता है और जब कोई उपयोगकर्ता ग्रिड में एक पंक्ति का चयन करता है तो इसे भी अपडेट किया जाता है। क्या आप यही चाहते थे, यदि नहीं तो क्या आप अपने प्रश्न का विस्तार कर सकते हैं?

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
Tom Dudfield 18 फरवरी 2011, 13:26
मैंने अपने प्रश्न का विस्तार किया है। आपका उत्तर वही है जो मैंने पहले ही किया है, लेकिन यह UI में कार्य नहीं करता जैसा मैं चाहूंगा
 – 
profanis
18 फरवरी 2011, 12:47