2013-03-04 24 views
-1

如何在WPF列表框窗口上使用以下代碼。它在正常的Win窗體Listbox上工作正常,所以我想測試WPF窗口,但我得到錯誤說列表框所選wpf窗口的指令

'System.Windows.Controls.ListBox'不包含'SelectedIndices'的定義,並沒有擴展方法'SelectedIndices '接受型的第一參數‘System.Windows.Controls.ListBox’可以找到(是否缺少using指令或程序集引用?)

這是原來的代碼我有

private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     try 
     { 

      this.textBox1.Text = people[listBox1.SelectedIndices[0]].name; 
      this.connectbox.Text = people[listBox1.SelectedIndices[0]].ipaddress; 




     } 
     catch 
     { 
     } 
+1

'它在正常的Win表單列表框中工作正常 - 如果您希望從winforms複製粘貼代碼,WPF可能不適合您。 WPF需要一個完全不同於傳統的,在Winforms中操縱ui-elements-in-code-behind思維的心態(MVVM)。 – 2013-03-04 14:42:24

回答

0

這就是我所說的「WPF心智」的一個例子,它與古老的winform思想融合在一起邏輯和UI:

<Window x:Class="WpfApplication4.Window11" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window11" Height="300" Width="300"> 
    <DockPanel> 
     <Button DockPanel.Dock="Top" Content="Copy" Command="{Binding CopyCommand}"/> 

     <UniformGrid Columns="2"> 
      <ListBox ItemsSource="{Binding Items}" SelectionMode="Extended"> 
       <ListBox.ItemContainerStyle> 
        <Style TargetType="{x:Type ListBoxItem}"> 
         <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/> 
        </Style> 
       </ListBox.ItemContainerStyle> 
      </ListBox> 
      <ListBox ItemsSource="{Binding SelectedItems}"/> 
     </UniformGrid> 
    </DockPanel> 
</Window> 

代碼背後:

using System.Linq; 
using BaseWPFFramework.MVVM; 
using System.Collections.ObjectModel; 

namespace WpfApplication4 
{ 
    public partial class Window11 
    { 
     public Window11() 
     { 
      InitializeComponent(); 
      DataContext = new ListViewModel(); 
     } 
    } 
} 

視圖模型:

public class ListViewModel: ViewModelBase 
    { 
     private ObservableCollection<Selectable<string>> _items; 
     public ObservableCollection<Selectable<string>> Items 
     { 
      get { return _items ?? (_items = new ObservableCollection<Selectable<string>>()); } 
     } 

     private ObservableCollection<string> _selectedItems; 
     public ObservableCollection<string> SelectedItems 
     { 
      get { return _selectedItems ?? (_selectedItems = new ObservableCollection<string>()); } 
     } 

     private DelegateCommand _copyCommand; 
     public DelegateCommand CopyCommand 
     { 
      get { return _copyCommand ?? (_copyCommand = new DelegateCommand(Copy)); } 
     } 

     private void Copy() 
     { 
      SelectedItems.Clear(); 
      Items.Where(x => x.IsSelected).Select(x => x.Value).ToList().ForEach(SelectedItems.Add); 
     } 

     public ListViewModel() 
     { 
      Enumerable.Range(1, 100).Select(x => new Selectable<string>("Item" + x.ToString())).ToList().ForEach(x => Items.Add(x)); 
     } 
    } 

    public class Selectable<T>: ViewModelBase 
    { 
     private T _value; 
     public T Value 
     { 
      get { return _value; } 
      set 
      { 
       _value = value; 
       NotifyPropertyChange(() => Value); 
      } 
     } 

     private bool _isSelected; 
     public bool IsSelected 
     { 
      get { return _isSelected; } 
      set 
      { 
       _isSelected = value; 
       NotifyPropertyChange(() => IsSelected); 
      } 
     } 

     public Selectable(T value) 
     { 
      Value = value; 
     } 

     public Selectable(T value, bool isSelected): this(value) 
     { 
      IsSelected = isSelected; 
     } 

     public override string ToString() 
     { 
      return Value != null ? Value.ToString() : string.Empty; 
     } 

    } 

只需複製並粘貼我的代碼在File -> New -> WPF Application,看看效果如何。

請注意,我使用的是通用解決方案(Selectable<T>),因此您可以將它用於您想要的任何類。

此外,請不要在WPF中執行如下操作:this.textBox1.Text = whatever。 WPF鼓勵分離UI和數據,並且您必須瞭解UI Is Not Data才能正確使用WPF。如果您期望WPF獲得良好結果,請保留winforms心態。

而是,或者創建一個合適的ViewModel來保存文本框中顯示的數據,或者直接將文本框綁定到SelectedItems的實例,如我的示例中所示。

順便說一下,無題的評論,normal的方式不再是winforms的方式。所有最近的(< 10 Years)技術(WPF,Silverlight,WinRT)都是基於XAML的,並鼓勵使用MVVM。 這意味着winforms的方式現在是old的方式,而不是normal的方式。