ListBox SelectedItem绑定已损坏

Muh*_*mar 2 data-binding wpf prism telerik mvvm

我正在使用SelectedItem数据绑定的WPF一个奇怪的问题RadListBox,试图找出但没有运气.以下是我的情景

  1. 我正在使用TelerikControls(RadListBox,和RadButton)
  2. RadButton放在一个内部ItemsControl,RadListBoxItemsControl绑定到同一个ItemsSource.
  3. 我正在使用PRISMMVVM.
  4. 我想要的是当我点击按钮时,RadListBox自动选择相同的项目,(这部分工作正常).
  5. 问题:只要我点击任何项目,RadListBox然后单击任何按钮,项目选择就会停止工作.
  6. 编辑:我尝试使用标准WPF ListBox通过为选择更改事件和Command和CommandParameter的附加属性添加附加行为来做同样的事情,它工作正常,所以它看起来像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; }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

最后填充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;
Run Code Online (Sandbox Code Playgroud)

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

Muh*_*mar 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}}">
Run Code Online (Sandbox Code Playgroud)