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