2012-09-01 17 views
2

我正在使用WPFRadListBox有一個奇怪的問題SelectedItem數據綁定,試圖找出,但沒有運氣。以下是我的方案列表框選定的項綁定破損

  1. 我使用Telerik控制(RadListBoxRadButton
  2. RadButton被放置在ItemsControlRadListBoxItemsControl是結合內部同樣ItemsSource
  3. 我使用PRISMMVVM
  4. 我想要的是當我點擊按鈕,同樣的項目是從RadListBox自動,選擇(這部分做工精細)
  5. 問題:只要我點擊RadListBox的任何項目,然後再次點擊任何按鈕,項目選擇將停止工作。
  6. 編輯:我嘗試了與標準WPF列表框相同的東西,通過添加選擇附加行爲改變事件和附加屬性的命令和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; } 
} 

的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> 

和最後填充視圖模型和設置在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專業術語的專業知識?

回答

6

最後我想通了這個問題,我只需要更換RadListBoxSelectedItem結合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}}">