3

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

public List<City> Cities
{
    get { return GetCities(); }
}

当我使用通常的绑定它时

ItemsSource="{Binding Cities}"

它工作正常。我还有另一个名为 Rivers 的密封类和相同的公共财产(名称)。

public List<River> Rivers
{
    get { return GetRivers(); }
}

它们都有一个共同的属性“名称”,这是列表框显示的内容。在河流、城市和其他职业之间交换的最佳方式是什么?从理论上讲,我想要一个通用 List 属性,它可以绑定并将其值设置为 Rivers 或 Cities 等。但我认为创建通用 List 属性是不可能的。所有类都是密封的,我无法修改它们。

有什么建议么?谢谢

4

2 回答 2

4

如果您无法更改原始类,您最好为 River 和 City 创建两个适配器类,每个都实现一个带有 Name 属性的公共接口。

这样,您可以只使用一个列表来表示它们中的每一个,并随意在两者之间进行交换。

例如

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; }
于 2013-03-25T20:06:40.117 回答
1

您可以使用dynamic绑定到您的列表ListBox并根据您需要显示的内容进行填充,您可以使用它来DisplayMemberPath显示NameListBox

工作示例:

代码:

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

xml:

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

结果:

在此处输入图像描述

于 2013-03-25T20:20:24.960 回答