3

私は WPF Windows アプリ プロジェクトを持っています。2 つの ListBox コントロールを持つウィンドウがあります。問題は、1 つのソースをこれら 2 つのコントロールにバインドするにはどうすればよいかということです。ソースは次のようになります:

class student
{
    public string name{get;set;}
    public int age{get;set;}
}

ObservableCollection<student> m_myGroup;

私がしたい: 年齢 > 25 の場合、m_myGroup に ListBox1 バインディング 年齢 <=25 の場合、m_myGroup に ListBox2 バインディング 明らかに、2 つの ListBox の両方に

TextBlock Text={binding Path=name}

また、DataTrigger を使用してアイテムの可視性プロパティを Hidden または Show にしたくありません。また、ICollectionView を使用してソースをフィルター処理しようとしましたが、他の ListBox に影響します。ListBoxごとに2つのフィルターを作成する方法を知っている人はいますか?それらは1つのソースにのみバインドされますか?

4

2 に答える 2

2

m_myGroup用に2つ作成ICollectionViewし、それらをフィルタリングして、それらをにバインドしListBoxesます。

そのことについては、ListBox.IsSynchronizedWithCurrentItemをfalseに設定しても、選択するときの間に影響はありませんListBoxes

これを参照してください。

編集:

public class StudentHandler
{
    ObservableCollection<student> m_myGroup;

    public CollectionViewSource YoungStudentsViewSource { get; private set; }
    public CollectionViewSource OldStudentsViewSource { get; private set; }

    public StudentHandler
    {
        YoungStudentsViewSource = new CollectionViewSource {Source = m_myGroup};
        OldStudentsViewSource = new CollectionViewSource {Source = m_myGroup}; 

        YoungStudentsViewSource.Filter = (stud) => {return (stud as student).age<=25;};
        OldStudentsViewSource .Filter = (stud) => {return (stud as student).age>25;};
    }
}

この後、にバインドViewSourcesしますListBoxes

于 2012-09-14T05:09:55.033 に答える
0
<Window x:Class="ComboboxStyle.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:converter="clr-namespace:ComboboxStyle"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <converter:AgeConverter x:Key="ageConv"/>
</Window.Resources>

<Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <ListBox Grid.Column="0"  DisplayMemberPath="Name" ItemsSource="{Binding Students, Converter={StaticResource ageConv}, ConverterParameter=agelessthan25}" >
    </ListBox>
    <ListBox  Grid.Column="1" DisplayMemberPath="Name" ItemsSource="{Binding Students, Converter={StaticResource ageConv}, ConverterParameter=agegreaterthan25}" >
    </ListBox>
</Grid>

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Students = new ObservableCollection<Student>();
        Students.Add(new Student() { Name = "Aeqwwe", Age = 24 });
        Students.Add(new Student() { Name = "bqwewqeq", Age = 28 });
        Students.Add(new Student() { Name = "cwqeqw", Age = 23 });
        Students.Add(new Student() { Name = "dweqqw", Age = 29 });
        Students.Add(new Student() { Name = "eqweweq", Age = 20 });
        DataContext = this;
    }
    public ObservableCollection<Student> Students { get; set; }
}
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}
public class AgeConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var items = value as ObservableCollection<Student>;
        if (parameter != null && items != null)
        {
            if (parameter.ToString() == "agelessthan25")
            {
                return items.Where(i => i.Age < 25).ToList();
            }
            else if (parameter.ToString() == "agegreaterthan25")
            {
                return items.Where(i => i.Age >= 25).ToList();
            }
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

これがお役に立てば幸いです

于 2012-09-14T05:35:35.630 に答える