C# 绑定到泛型属性

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(); } } 公开列表河流 { 获取

我正在尝试将列表框绑定到ViewModel中的属性。我想做的是能够随时将该属性交换到具有相同字段的另一个列表中。所以现在我有这个:

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>