ListBox SelectedItem绑定已损坏

时间:2012-09-01 01:58:21

标签: wpf data-binding mvvm telerik prism

我正在使用WPFRadListBox SelectedItem数据绑定有一个奇怪的问题,试图找出但没有运气。以下是我的方案

  1. 我正在使用Telerik控件(RadListBoxRadButton
  2. RadButton位于ItemsControl内,RadListBoxItemsControl绑定到同一ItemsSource
  3. 我正在使用PRISMMVVM
  4. 我想要的是当我点击按钮时,会自动从RadListBox中选择相同的项目,(此部分正常工作)
  5. 问题:只要点击RadListBox的任何项目,然后点击任何按钮,项目选择就会停止工作。
  6. 编辑:我通过为选择更改事件和Command和CommandParameter的附加属性添加附加行为,尝试使用标准WPF ListBox执行相同操作,它工作正常,因此看起来像Telerik RadListBox的问题吗
  7. 现在让我来编码。

    ViewModel类

    public class MainViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        // Create the OnPropertyChanged method to raise the event 
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    
        public DelegateCommand<object> StudentSelected { get; set; }
        public DelegateCommand<object> ButtonPressed { get; set; }
    
        private void OnStudentSelected(object par)
        {
            //Debugger.Break();
            if (handled == false)
            {
                Student std = par as Student;
                if (std != null)
                {
                    SelectedStudent = std;
                }
            }
            handled = false;
        }
    
        private void OnButtonPressed(object par)
        {
            //Debugger.Break();
            handled = true;
            String std = par as String;
            if (std != null)
            {
                foreach (Student st in _students)
                {
                    if (st.Name.Equals(std))
                    {
                        SelectedStudent = st;
                        break;
                    }
                }
            }
        }    
    
        private Student _selectedstudent;
        private bool handled = false;
    
    
        public MainViewModel()
        {
            StudentSelected = new DelegateCommand<object>(OnStudentSelected);
            ButtonPressed = new DelegateCommand<object>(OnButtonPressed);
        }
    
        public Student SelectedStudent
        {
            get
            {
                return _selectedstudent;
            }
            set
            {
                _selectedstudent = value;
                OnPropertyChanged("SelectedStudent");
            }
        }
    
    
        private ObservableCollection<Student> _students;
        public ObservableCollection<Student> Students
        {
            get
            {
                return _students;
            }
            set
            {
                _students = value;
                OnPropertyChanged("Students");
            }
        }
    }
    
    public class Student
    {
        public String Name { get; set; }
        public String School { get; set; }
    }
    

    MainView XAML

        <telerik:RadListBox Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Students}" Command="{Binding StudentSelected}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=SelectedItem}" SelectedItem="{Binding SelectedStudent, Converter={StaticResource DebugConverter}}">
    <!-- The above debug converter is just for testing binding, as long as I keep on clicking button the Converter is being called, but the moment I click on RadListBoxItem the Converter is not called anymore, even when I click back on buttons -->
                    <telerik:RadListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}"></TextBlock>
                        </DataTemplate>
                    </telerik:RadListBox.ItemTemplate>
                </telerik:RadListBox>
                <Label Grid.Row="0" Grid.Column="1" Content="{Binding SelectedStudent.Name}"></Label>
                <StackPanel Grid.Column="1" Grid.Row="1" Orientation="Horizontal">
                    <ItemsControl ItemsSource="{Binding Students}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <telerik:RadButton Width="100" Height="70" Content="{Binding Name}" Command="{Binding RelativeSource={RelativeSource FindAncestor, 
        AncestorType={x:Type Window}}, Path=DataContext.ButtonPressed}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}">
                            </telerik:RadButton>
                        </DataTemplate>    
                        </ItemsControl.ItemTemplate>
    
                    </ItemsControl>
                </StackPanel>
    

    ,最后填充ViewModel并设置Datacontext

    MainViewModel mvm = new MainViewModel();
                ObservableCollection<Student> students = new ObservableCollection<Student>();
                students.Add(new Student { Name = "Student 1", School = "Student 1 School" });
                students.Add(new Student { Name = "Student 2", School = "Student 2 School" });
                students.Add(new Student { Name = "Student 3", School = "Student 3 School" });
    
                mvm.Students = students;
    
                //Bind datacontext
                this.DataContext = mvm;
    

    请提出您的建议,并与WPF术语分享您的专业知识?

1 个答案:

答案 0 :(得分:6)

最后我发现了问题,我只需要将RadListBox SelectedItem绑定替换为TwoWay

<telerik:RadListBox Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Students}" Command="{Binding StudentSelected}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=SelectedItem}" SelectedItem="{Binding SelectedStudent, Mode,TwoWay, Converter={StaticResource DebugConverter}}">