как сделать элементы списка выбранными из DataContext, когда ListBox привязан из кода позади

Я пытаюсь установить некоторые элементы ListBox как выбранные при привязке через DataContext. ListBox привязан через код.

Я привязываю свой список к конструктору пользовательского элемента управления

TradesListBox.ItemsSource = config.OfType<Trade>().ToList();

XAML ниже является частью UserControl, свойство DisplayMemberPath которого задается с помощью конструктора, как показано в строке выше, в то время как я пытаюсь установить свойство SelectedItem из DataContext, которое передается через соответствующее окно. Но SelectedItem не отображается

<Label Grid.Row="1" Grid.Column="0" Target="{Binding ElementName=TradesListBox}" Style="{StaticResource LabelStyle}" FontSize="18" HorizontalAlignment="Right">_Trades</Label>
<ListBox Grid.Row="1" Grid.Column="1" Name="TradesListBox"  HorizontalAlignment="Stretch" Height="70" Margin="2" DisplayMemberPath="ConfigValue" SelectedItem="{Binding Trade.ConfigValue}" SelectionMode="Multiple" />

private List<Trade> trade;
[DataMember]
public virtual List<Trade> Trade
{
    get
    {
        if (trade == null)
            trade = new List<Trade>();
        return trade; 
    }
    set
    { trade = value == null ? new List<Trade>() : value; }
}

person Shantanu Gupta    schedule 29.07.2013    source источник
comment
Разместите соответствующий код и XAML.   -  person Federico Berasategui    schedule 29.07.2013
comment
К чему привязывается выбранное значение? Также необходимо синхронизировать список   -  person Gayot Fow    schedule 29.07.2013
comment
Используется ли здесь контекст данных совместно с тем же контекстом данных здесь? stackoverflow.com/q/17899868/1042344   -  person Gayot Fow    schedule 31.07.2013


Ответы (2)


Я думаю, что элементы выбраны, но не выделены, в таком случае попробуйте установить Focus на ListBox и посмотреть, сработает ли это для вас.

TradesListBox.ItemsSource = config.OfType<Trade>().ToList();

// Let say you want to Select first and second item
TradesListBox.SelectedItems.Add(TradesListBox.Items[0]);
TradesListBox.SelectedItems.Add(TradesListBox.Items[1]);

// Set focus on ListBox
TradesListBox.Focus();
person Nitesh    schedule 29.07.2013

Привет, если вы используете MVVM, вы можете привязать SelectedItem к ListBox, например

xaml

<ListBox ItemsSource="{Binding Students}" SelectedItem="{Binding SelectedStudent}" DisplayMemberPath="Name"></ListBox>

.cs

    public partial class MainWindow : Window
{
    public MainWindow()
    {
       InitializeComponent();
       DataContext = new ViewModel();
    }
}

ViewModel

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        Students = new ObservableCollection<Student>();
        Students.Add(new Student { Name = "abc", Age = 20 });
        Students.Add(new Student { Name = "pqr", Age = 30 });
        Students.Add(new Student { Name = "xyz", Age = 40 });
        SelectedStudent = Students[0];
    }

    public ObservableCollection<Student> Students { get; set; }

    Student selectedStudent;
    public Student SelectedStudent
    {
        get { return selectedStudent; }
        set { selectedStudent = value; Notify("SelectedStudent"); }
    }


    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

}

CustomType

public class Student:INotifyPropertyChanged
{
    string name;
    public string Name {
        get
        { return name; }

        set
        {
            name = value;
            Notify("Name");
        }
    }


    int age;

    public int Age
    {
        get
        { return age; }

        set
        {
            age = value;
            Notify("Age");
        }
    }


    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Помните, что ссылка на SelectedItem должна совпадать с ссылкой на один из элементов в коллекции, привязанной к ItemsSource > Edit

<ListBox Grid.Row="1" Grid.Column="1" Name="TradesListBox"  HorizontalAlignment="Stretch" 
Height="70" Margin="2" DisplayMemberPath="ConfigValue" 
SelectedValue="{Binding Trade.ConfigValue}" 
SelectedValuePath="ConfigValue" SelectionMode="Multiple" />
person yo chauhan    schedule 29.07.2013
comment
Как связать набор SelectedItem, если ссылки не совпадают? - person Shantanu Gupta; 01.08.2013
comment
Тогда вам нужно будет использовать SelectedValue - person yo chauhan; 01.08.2013
comment
SelectedValue тоже не сработало. Мне пришлось захватить событие DataContextChange, чтобы вручную установить свойство SelectedItems.Add. - person Shantanu Gupta; 01.08.2013
comment
Я только что видел, как вы редактировали свой вопрос. Теперь есть две ошибки: одна использует SelectedValue вместо SelectedItem, а другая, когда вы привязываете SelectedValue, вы должны указать свойство SelectedValuePath - person yo chauhan; 01.08.2013
comment
Нет, не сработало. Я привязал к SelectedValuePath, поскольку свойство SelectedMemberPath не существует для ListBox. - person Shantanu Gupta; 01.08.2013