Инициализация ComboBox в сетке данных, Silverlight 4.0 - PullRequest
1 голос
/ 30 мая 2010

У меня есть таблица данных со списком объектов MyPlayer, связанных с ItemsSource, внутри сетки есть ComboBox, которые связаны со списком внутреннего объекта, и привязка работает правильно: когда я выбираю один из элементов, его значение передается в данные Модель и соответственно обновляется в других местах, где она используется.

Единственная проблема: начальные выборы не отображаются в моих комбинированных списках. Я не знаю почему ..?

Экземпляр ViewModel назначен для просмотра DataContext. Вот сетка с комбинированными ячейками (сетка привязана к свойству SquadPlayers ViewModel):

    <data:DataGrid ="True" AutoGenerateColumns="False" ItemsSource="{Binding SquadPlayers}">
        <data:DataGrid.Columns>
            <data:DataGridTemplateColumn Header="Rig." Width="50">
                <data:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox SelectedItem="{Binding Rigid, Mode=TwoWay}"
                                  ItemsSource="{Binding IntLevels, Mode=TwoWay}"/>
                    </DataTemplate>
                </data:DataGridTemplateColumn.CellTemplate>
            </data:DataGridTemplateColumn>
        </data:DataGrid.Columns>
    </data:DataGrid>

Вот класс ViewModel (метод _model_DataReceivedEvent вызывается асинхронно, когда данные поступают с сервера):

public class SquadViewModel : ViewModelBase<SquadModel>
{
    public SquadViewModel()
    {
        SquadPlayers = new ObservableCollection<SquadPlayer>();
    }

    private void _model_DataReceivedEvent(List<SostavPlayerData> allReadyPlayers)
    {
        TeamTask task = new TeamTask { Rigid = 1 };
        foreach (SostavPlayerData spd in allReadyPlayers)
        {
            SquadPlayer sp = new SquadPlayer(spd, task);
            SquadPlayers.Add(sp);
        }
        RaisePropertyChanged("SquadPlayers");
    }

А вот класс SquadPlayer (его объекты связаны со строками сетки):

public class SquadPlayer : INotifyPropertyChanged
{
    public SquadPlayer(SostavPlayerData spd)
    {
        _spd = spd;

        Rigid = 2;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private int _rigid;
    public int Rigid
    {
        get { return _rigid; }
        set
        {
            _rigid = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Rigid"));
            }
        }
    }

    private readonly ObservableCollection<int> _statIntLevels = new ObservableCollection<int> { 1, 2, 3, 4, 5 };
    public ObservableCollection<int> IntLevels { get { return _statIntLevels; } }

Ожидается, что все комбинированные блоки "Жесткие" будут установлены в значение "2", но они не выбраны (элементы находятся в раскрывающемся списке, и, если выбрано какое-либо значение, оно перейдет в ViewModel). *

Что не так с этим примером? Любая помощь будет приветствоваться.

Спасибо.

1 Ответ

3 голосов
/ 31 мая 2010

Измените порядок вашего XAML на

ItemsSource="{Binding IntLevels, Mode=TwoWay}" 
SelectedItem="{Binding Rigid, Mode=TwoWay}"

Я знаю, это кажется смешным, но у меня была эта проблема раньше. Он пытается связать SelectedValue до того, как ItemSource существует, поэтому после инициализации все работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...