3

ListBoxをViewModelのプロパティにバインドしようとしています。私がやりたいのは、いつでもそのプロパティを同じフィールドを持つ別のリストに交換できるようにすることです。だから今私はこれを持っています:

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

通常の方法でこれをバインドすると

ItemsSource="{Binding Cities}"

それはうまくいきます。Riversと呼ばれる別の封印されたクラスとそのための同じ公共財産(名前)もあります。

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

これらは両方とも、リストボックスに表示される共通のプロパティ「名前」を持っています。Rivers、Cities、および他のクラス間で交換するための最良の方法は何ですか?理論的には、RiversやCitiesなどにバインドしてその値を設定できる汎用Listプロパティが必要ですが、汎用Listプロパティを作成することはできないと思います。すべてのクラスは封印されており、変更することはできません。

助言がありますか?ありがとう

4

2 に答える 2

4

元のクラスを変更できない場合は、RiverとCity用に2つのアダプタークラスを作成し、それぞれにNameプロパティを使用して共通のインターフェイスを実装することをお勧めします。

そうすれば、1つのリストを使用してそれぞれを表し、2つを自由に切り替えることができます。

例えば

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して、Nameまたはその他の一般的なプロパティを表示できます。ListBox

実例:

コード:

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

Xaml:

<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 に答える