我正在尝试将ListBox绑定到ViewModel中的属性。我想做的是能够随时将该属性换出到具有相同字段的另一个列表。所以目前我有这个:
public List<City> Cities
{
get { return GetCities(); }
}
当我使用通常的
绑定它时ItemsSource="{Binding Cities}"
它工作正常。我还有另一个名为Rivers的密封类和相同的公共属性(Name)。
public List<River> Rivers
{
get { return GetRivers(); }
}
他们都有一个共同的财产&#34;姓名&#34;这是列表框显示的内容。在河流,城市和其他班级之间交换的最佳方式是什么?从理论上讲,我想要一个通用的List属性,它可以被绑定并设置为Rivers或Cities等的值。但我不认为可以创建一个通用的List属性。所有课程都是密封的,我无法对其进行修改。
有什么建议吗? 感谢
答案 0 :(得分:4)
如果你不能改变原来的类,你可能最好为River和City创建两个adapter类,每个类都实现一个带有Name属性的公共接口。
这样你就可以使用一个列表来表示每个列表,并随意在两者之间进行交换。
e.g。
public interface INamed
{
string Name { get; }
}
public class RiverAdapter : INamed
{
private River _river;
public string Name { get { return _river.Name; } }
}
public class CityAdapter : INamed
{
private River _city;
public string Name { get { return _city.Name; } }
}
所以你的列表声明将成为:
public IEnumerable<INamed> Items { get; set; }
答案 1 :(得分:1)
您可以使用绑定到dynamic
的{{1}}列表,并根据您需要显示的内容填充该列表,然后您可以使用ListBox
来显示DisplayMemberPath
或Name
工作示例:
代码:
ListBox
的Xaml:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private ObservableCollection<dynamic> _listBoxItems = new ObservableCollection<dynamic>();
public ObservableCollection<dynamic> ListBoxItems
{
get { return _listBoxItems; }
set { _listBoxItems = value; }
}
public List<River> Rivers
{
get
{
return new List<River>
{
new River { Name = "River1" } ,
new River { Name = "River2"}
};
}
}
public List<City> Cities
{
get
{
return new List<City>
{
new City { Name = "City1" } ,
new City { Name = "City2"}
};
}
}
private void button_City_Click(object sender, RoutedEventArgs e)
{
ListBoxItems.Clear();
Cities.ForEach(i => ListBoxItems.Add(i));
}
private void button_River_Click(object sender, RoutedEventArgs e)
{
ListBoxItems.Clear();
Rivers.ForEach(i => ListBoxItems.Add(i));
}
}
public sealed class City
{
public string Name { get; set; }
}
public sealed class River
{
public string Name { get; set; }
}
结果: