2

私はSelectedItemデータバインディングでWPF奇妙な問題を抱えており、RadListBox理解しようとしていますが運がありません。以下は私のシナリオです

  1. Telerikコントロール ( RadListBox、およびRadButton)を使用しています
  2. RadButtonItemsControlは a内RadListBoxに配置され、ItemsControl同じ にバインドされItemsSourceます。
  3. と を使用PRISMしてMVVMいます。
  4. 私が欲しいのは、ボタンをクリックすると、同じ項目がRadListBox自動的に選択されることです(この部分は正常に動作しています)
  5. 問題:のいずれかの項目をクリックしてから、いずれかのボタンを再度クリックするとすぐにRadListBox、項目の選択が機能しなくなります。
  6. 編集:選択変更イベントの添付動作と 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 専門用語の専門知識を共有してください。

4

1 に答える 1

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}}">
于 2012-09-10T09:33:45.703 に答える