绑定到通用属性

时间:2013-03-25 20:00:57

标签: c# silverlight xaml generics binding

我正在尝试将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属性。所有课程都是密封的,我无法对其进行修改。

有什么建议吗? 感谢

2 个答案:

答案 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来显示DisplayMemberPathName

中的任何其他常见的prerty

工作示例:

代码:

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; }
}

结果:

enter image description here