Если сетка данных не была показана, я не могу установить в ней строку текущей позиции (silverlight) - PullRequest
1 голос
/ 27 июня 2011

У меня есть приложение с двумя вкладками. На первой вкладке размещена кнопка, которая устанавливает текущую позицию в dataGrid1 на второй вкладке. Хотя я не буду показывать вторую вкладку, я не могу установить текущую позицию с помощью кнопки 1.

<UserControl x:Class="SilverlightApplication9.MainPage"
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"
d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

<Grid x:Name="LayoutRoot" Background="White">
    <sdk:TabControl Height="234" HorizontalAlignment="Left" Margin="52,44,0,0" Name="tabControl1" VerticalAlignment="Top" Width="326">
        <sdk:TabItem Header="tabItem1" Name="tabItem1">
            <Grid>
                <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="74,44,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
            </Grid>
        </sdk:TabItem>
        <sdk:TabItem Header="tabItem2" Name="tabItem2">
            <Grid>
                <sdk:DataGrid ItemsSource="{Binding strs}" RowBackground="White" AutoGenerateColumns="False" Height="141" HorizontalAlignment="Left" Margin="36,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="199">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn Binding="{Binding}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto" />
                    </sdk:DataGrid.Columns>
                </sdk:DataGrid>
            </Grid>
        </sdk:TabItem>
    </sdk:TabControl>
</Grid>

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace SilverlightApplication9
{
    public partial class MainPage : UserControl
    {
        private ObservableCollection<string> _strs = new ObservableCollection<string>();
        public ObservableCollection<string> strs { get { return _strs; } set { _strs = value; } }
        public MainPage()
        {
            this.DataContext = this;
            InitializeComponent();
            strs.Add("1");
            strs.Add("2");
            strs.Add("3");
            strs.Add("4");
            strs.Add("5");
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            dataGrid1.SelectedIndex = 2;
        }
    }

}

1 Ответ

0 голосов
/ 28 июня 2011

Проблема в том, что DataGrid не загружается при попытке установить SelectedIndex в обработчике нажатия кнопки, если вы еще не перешли на вкладку, содержащую DataGrid.

Способ достижения того, что вы хотите, это использовать привязку данных.Вы также захотите внедрить INotifyPropertyChanged для любых последующих изменений в свойстве, с которым вы связываете DataGrid.SelectedIndex.Ниже приведен грубый пример того, как сделать то, что вы хотите в предоставленном вами коде.

public partial class MainPage : UserControl, INotifyPropertyChanged
{
    private ObservableCollection<string> _strs 
                                        = new ObservableCollection<string>();
    public ObservableCollection<string> strs
    {
        get { return _strs; }
        set { _strs = value; }
    }

    public MainPage()
    {
        this.DataContext = this;
        InitializeComponent();
        strs.Add("1");
        strs.Add("2");
        strs.Add("3");
        strs.Add("4");
        strs.Add("5");

        SelectedIndex = 0;
    }

    private int _selectedIndex;
    public int SelectedIndex
    {
        get { return _selectedIndex; }
        set
        {
            _selectedIndex = value;
            var pChanged = PropertyChanged;
            if (pChanged != null)
                pChanged(this, new PropertyChangedEventArgs("SelectedIndex"));
        }
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        SelectedIndex ++;
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Затем обновите определение DataGrid в xaml следующим образом:

<sdk:DataGrid ItemsSource="{Binding strs}"
              SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}"
              RowBackground="White"
              AutoGenerateColumns="False"
              Height="141"
              HorizontalAlignment="Left"
              Margin="36,12,0,0"
              Name="dataGrid1"
              VerticalAlignment="Top"
              Width="199">
    <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn Binding="{Binding}"
                                CanUserReorder="True"
                                CanUserResize="True"
                                CanUserSort="True"
                                Width="Auto" />
    </sdk:DataGrid.Columns>
</sdk:DataGrid>
...