我正在使用WPFRadListBox SelectedItem数据绑定(bind)有一个奇怪的问题,试图弄清楚但没有运气。以下是我的情况

  • 我正在使用Telerik控件(RadListBoxRadButton)
  • RadButton放在ItemsControl内,RadListBoxItemsControl绑定(bind)到相同的ItemsSource
  • 我正在使用PRISMMVVM
  • 我想要的是当我单击按钮时,自动从RadListBox中选择相同的项目,(这部分工作正常)。
  • 问题:一旦我单击RadListBox的任何项目,然后再单击任何按钮,该项目选择就会停止。
  • 编辑:我通过添加用于选择更改事件的附加行为以及Command和CommandParameter的附加属性来尝试使用标准WPF ListBox进行相同操作,它工作正常,因此看起来好像是Telerik RadListBox的问题?

  • 现在让我来编写代码。

    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 Jargon的专业知识?

    最佳答案

    最后我弄清楚了这个问题,我只需要将RadListBox SelectedItem绑定(bind)替换为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}}">
    

    09-27 16:13