【问题标题】:ComboBox doesn't populate with data in Silverlight MVVMComboBox 不填充 Silverlight MVVM 中的数据
【发布时间】:2014-06-11 11:53:01
【问题描述】:

嗯,我不知道还能做什么。我检查了代码,一切正常。

所以我的问题是组合框没有填充任何数据,我检查了 ObservableCollection 集并且它有数据但它没有任何填充

我使用了 MVVM 模式,一切顺利,但没有调用 GET

我可以得到一些提示可能是什么原因,因为我没有想法

StudentDetailView.xaml

    <Grid x:Name="LayoutRoot" Background="White">
    <Grid DataContext="{Binding}" HorizontalAlignment="Left" Margin="12,12,0,0" Name="grid1" VerticalAlignment="Top" Height="176" Width="376">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="31*" />
        </Grid.RowDefinitions>
        <sdk:Label Content="Clasa ID:" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
        <ComboBox Grid.Column="1" Grid.Row="0" Height="23" HorizontalAlignment="Left" Margin="3" 
                  Name="clasaIDComboBox" VerticalAlignment="Center" Width="120"
                  DisplayMemberPath="Nume" 
                  SelectedValuePath="ID" />
        <sdk:Label Content="Data Nasterii:" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
        <sdk:DatePicker Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="3" Name="data_NasteriiDatePicker" VerticalAlignment="Center" Width="120" />
        <sdk:Label Content="ID:" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
        <TextBox Grid.Column="1" Grid.Row="2" Height="23" HorizontalAlignment="Left" Margin="3" Name="iDTextBox" VerticalAlignment="Center" Width="120" />
        <sdk:Label Content="Liceu ID:" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
        <TextBox Grid.Column="1" Grid.Row="3" Height="23" HorizontalAlignment="Left" Margin="3" Name="liceuIDTextBox" VerticalAlignment="Center" Width="120" />
        <sdk:Label Content="Nume:" Grid.Column="0" Grid.Row="4" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
        <TextBox Grid.Column="1" Grid.Row="4" Height="23" HorizontalAlignment="Left" Margin="3" Name="numeTextBox" VerticalAlignment="Center" Width="120" />

    </Grid>
    <Button Content="Save Student" Height="23" HorizontalAlignment="Left" Margin="194,232,0,0" Name="btnSaveStudent" VerticalAlignment="Top" Width="95" Click="btnSaveStudent_Click" />
    <Button Content="Cancel" Height="23" HorizontalAlignment="Left" Margin="295,232,0,0" Name="btnCancelStudent" VerticalAlignment="Top" Width="75" Click="btnCancelStudent_Click" />
    <ct:ValidationSummary Width="300" Margin="12,194,70,23" />
</Grid>

StudentDetailView.xaml.cs

public StudentDetailView()
    {
        InitializeComponent();
        clasaIDComboBox.SetBinding(ComboBox.ItemsSourceProperty, new Binding() { Path = new PropertyPath("LstHighSchool"), Mode = BindingMode.TwoWay });
        clasaIDComboBox.SetBinding(ComboBox.SelectedValueProperty, new Binding() { Path = new PropertyPath("SelectedHighSchool"), Mode = BindingMode.TwoWay, NotifyOnValidationError = true, ValidatesOnExceptions = true });
}

以及来自 StudentViewModel.cs 的部分代码

        private void AddNewStudentView(object param)
    {
        StudentDetailView addNewStudentView = new StudentDetailView();
        addNewStudentView.DataContext = new Student();
        var sdfsdfj = new StudentViewModel();

         LoadOperation<Liceu> li = DomainContext.Load(DomainContext.GetLiceusQuery());
        li.Completed += (s, e) =>
        {
            LstHighSchool = (s as LoadOperation<Liceu>).Entities.ToObservableCollection();
        };

        addNewStudentView.Closed += delegate
        {
            if (addNewStudentView.DialogResult == true)
            {
                Student newStudent = addNewStudentView.DataContext as Student;



                if (string.IsNullOrEmpty(newStudent.Nume))
                {
                    newStudent.ValidationErrors.Add(new ValidationResult("Numele nu poate sa fie invalid",new string[]{"Nume"}));
                }
                if (!newStudent.LiceuID.HasValue)
                {
                    newStudent.ValidationErrors.Add(new ValidationResult("Liceu ID este gol", new string[] { "LiceuID" }));
                }

                if (!newStudent.HasValidationErrors)
                {


                    if (newStudent != null)
                    {
                        DomainContext.Students.Add(newStudent);
                        LstStudents.Add(newStudent);

                    }
                }
                else
                {
                    addNewStudentView.Show();

                }
            }

        };

        addNewStudentView.Show();
        OnPropertyChanged("LstHighSchool");


    }
    private bool CanWork(object param)
    {
        return true; //for the moment this remains true, cause you can add all the time a new student, but this can be changed if there must be some conditions

    }

    private ObservableCollection<Liceu> _lstHighSchool;
    public ObservableCollection<Liceu> LstHighSchool
    {
        get
        {
            return _lstHighSchool;
        }
        set
        {
            _lstHighSchool = value;
            OnPropertyChanged("LstHighSchool");
        }
    }

    private int _selectedHighSchool;
    public int SelectedHighSchool
    {
        get
        {
            return _selectedHighSchool;
        }
        set
        {
            _selectedHighSchool = value;
            OnPropertyChanged("SelectedHighSchool");
        }
    }



    #endregion

【问题讨论】:

  • 您只能发布有问题的代码!
  • 为什么要从 C# 代码而不是 XAML 定义绑定?此外,您的 MVVM 做事方式看起来真的很糟糕,因为您当前正在从您所谓的 ViewModel 实例化和操作视图。
  • @Sajeetharan 我认为问题出在 ViewModel 因为 Get 没有被调用
  • @ken2k 我还是 MVVM 的新手,我在 C# 代码中定义绑定,以便在发生更改时将设计与代码绑定分开。
  • Grid DataContext="{Binding}" 此时有什么上下文?检查您的输出窗口以获取有关绑定的消息 - 如果存在绑定问题,它会在那里显示。

标签: c# silverlight xaml mvvm


【解决方案1】:

首先,去掉Grid DataContext="{Binding}",然后你在xaml中的组合框应该是这样的:

<ComboBox Grid.Column="1" Grid.Row="0" Height="23" HorizontalAlignment="Left" Margin="3" 
                  VerticalAlignment="Center" Width="120" DisplayMemberPath="Nume" 
                  SelectedValuePath="ID" ItemsSource="{Binding LstHighSchool}" 
                  SelectedValue="{Binding SelectedHighSchool}" />

其次,你的视图代码应该是这样的,

public StudentDetailView()
{
    InitializeComponent();
    this.DataContext= new StudentViewModel();
}

最后,在 StudentViewModel.cs 中应该有一个名为 LstHighSchool 的属性,看起来不错。

【讨论】:

  • 非常感谢,这是我的问题。除此之外,我发现我在 2 个地方更改了数据上下文。 1 在视图模型中,然后在视图中。实例化和操作视图的最佳实践是什么?我应该在视图中还是在视图模型中使用它们?谢谢
  • 我已经在各自的 ViewModel 中实例化了 View,这很好,因为 ViewModel 必须决定使用哪个 View。但是在 View 后面的代码中实例化 ViewModel (就像你在这里做的那样)也很方便,但是你在 View 中有一个 VM 实例,我认为这不是 MVVM-ish..
  • 谢谢,我需要阅读更多关于 MVVM 和模式的信息。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多