C# 绑定到泛型属性
我正在尝试将列表框绑定到ViewModel中的属性。我想做的是能够随时将该属性交换到具有相同字段的另一个列表中。所以现在我有这个:C# 绑定到泛型属性,c#,silverlight,xaml,generics,binding,C#,Silverlight,Xaml,Generics,Binding,我正在尝试将列表框绑定到ViewModel中的属性。我想做的是能够随时将该属性交换到具有相同字段的另一个列表中。所以现在我有这个: public List<City> Cities { get { return GetCities(); } } 它很好用。我还有另一个叫做Rivers的密封类和相同的公共属性(名称) public List<River> Rivers { get { return GetRivers(); } } 公开列表河流 { 获取
public List<City> Cities
{
get { return GetCities(); }
}
它很好用。我还有另一个叫做Rivers的密封类和相同的公共属性(名称)
public List<River> Rivers
{
get { return GetRivers(); }
}
公开列表河流
{
获取{return GetRivers();}
}
它们都有一个公共属性“Name”,这是列表框显示的内容。在河流、城市和其他类之间交换的最佳方式是什么?理论上,我想要一个通用的列表属性,可以绑定到河流或城市等,并设置其值。。但我认为不可能创建通用列表属性。所有类都是密封的,我不能修改它们
有什么建议吗?
谢谢如果您不能更改原始类,那么最好为River和City创建两个类,每个类都实现一个带有Name属性的公共接口 这样,您就可以使用单个列表来表示它们中的每一个,并可以随意在这两个列表之间进行交换 e、 g 因此,您的列表声明将成为:
public IEnumerable<INamed> Items { get; set; }
public IEnumerable Items{get;set;}
您可以使用绑定到列表框
的动态
列表,并根据需要显示的内容填充该列表,您还可以使用显示成员路径
在列表框中显示名称
或任何其他常用属性
工作示例:
代码:
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有ObservableCollection_listBoxItems=新ObservableCollection();
公共可观察收集ListBoxItems
{
获取{return\u listBoxItems;}
设置{u listBoxItems=value;}
}
公布河流名单
{
得到
{
返回新列表
{
新河{Name=“River1”},
新河{Name=“River2”}
};
}
}
公开名单城市
{
得到
{
返回新列表
{
新城{Name=“City1”},
新城{Name=“City2”}
};
}
}
私人作废按钮\u城市\u单击(对象发送者,路由目标e)
{
ListBoxItems.Clear();
Cities.ForEach(i=>ListBoxItems.Add(i));
}
私有无效按钮\u河\u点击(对象发送者,路由目标e)
{
ListBoxItems.Clear();
ForEach(i=>ListBoxItems.Add(i));
}
}
公共封闭类城市
{
公共字符串名称{get;set;}
}
封河
{
公共字符串名称{get;set;}
}
Xaml:
结果:
什么决定使用哪个列表?+1我错过了OP的密封/无法修改方面。适配器模式是一个很好的方法。谢谢。我试着弄乱接口,但无法让它们工作,但这个适配器模型正是我需要的。我得到“无法将类型Generic.List转换为Generic.List”@NewCode:You Cannot cast to a List:如果可以,您将能够在河流列表中插入一个城市。那是错误的。尝试IEnumerable。使用
动态是相当不必要的。将该属性作为非泛型的IList
或ICollection
,或作为IEnumerable
,可以正常工作,使用动态
可能会导致性能不佳。绑定
并不关心它是对象
还是动态
,它仍然会反映它。
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; }
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; }
}
<Window x:Class="WpfApplication10.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="199" Width="191" Name="UI">
<Grid DataContext="{Binding ElementName=UI}" >
<ListBox ItemsSource="{Binding ListBoxItems}" DisplayMemberPath="Name" Margin="0,0,0,29" />
<Button Content="City" Height="23" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Bottom" Width="75" Click="button_City_Click"/>
<Button Content="River" Height="23" HorizontalAlignment="Right" Name="button2" VerticalAlignment="Bottom" Width="75" Click="button_River_Click"/>
</Grid>
</Window>