Связывание данных WPF с несколькими элементами управления - PullRequest
1 голос
/ 31 июля 2011

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

У меня есть два класса: класс Task и класс Log, который хранится в виде коллекции в классе Task. Приведенные ниже списки привязаны к Задачам и внутренним Журналам для выбранной Задачи.

Проблема в том, что списки заполнены нормально при первой загрузке, но если я выберу другую задачу, я бы ожидал, что журналы будут обновлены в коллекции для новой задачи, но она не изменится из первоначально выбранной задачи при первой загрузке. Чего мне не хватает?

В конструкторе:

    <ListBox x:Name="listBoxTasks" ItemsSource="{Binding}" DisplayMemberPath="Key"
             Grid.Row="0" Grid.Column="0" Grid.RowSpan="2">
    </ListBox>
    <ListBox x:Name="listBoxLogs" 
             ItemsSource="{Binding Logs}" DisplayMemberPath="EntryDate"
             Grid.Row="1" Grid.Column="1">
    </ListBox>

В коде позади:

public MainWindow()
        {
            InitializeComponent();

            IMongoCollection<Task> tasks = DataManager.GetData();

            this.DataContext = tasks.AsQueryable();
        }

Класс задачи:

public class Task : BusinessBase<Task>
{
    public ObjectId _Id { get; set; }
    public string Key { get; set; }
    public string Description { get; set; }
    public string Summary { get; set; }
    public string Details { get; set; }

    public IEnumerable<Log> Logs { get; set; }
    public IEnumerable<Link> Links { get; set; }
    public IEnumerable<String> RelatedKeys { get; set; }
    public IEnumerable<TaskItem> Items { get; set; }
}

Ответы [ 5 ]

2 голосов
/ 31 июля 2011

Мне кажется, что второе связывание вообще не должно работать, поскольку DataContext является перечислимым значением Tasks, а само перечисляемое свойство не имеет свойства Logs. Вы можете попробовать работать с IsSynchronizedWithCurrentItem и привязкой к текущему элементу:

<ListBox x:Name="listBoxTasks" ItemsSource="{Binding}" DisplayMemberPath="Key"
         Grid.Row="0" Grid.Column="0" Grid.RowSpan="2"
         IsSynchronizedWithCurrentItem="True"> <!-- Set this -->
</ListBox>
<ListBox x:Name="listBoxLogs" DisplayMemberPath="EntryDate"
         Grid.Row="1" Grid.Column="1"
         ItemsSource="{Binding /Logs}"> <!-- Note the slash which indicates a binding to the current item -->
</ListBox>

Вы также можете связать с SelectedItem другого ListBox, но это создает избыточную зависимость между элементами управления. Также обратите внимание, что если вы изменяете какое-либо свойство в ваших объектах данных, вам необходимо реализовать интерфейс, упомянутый другими ответчиками: INotifyPropertyChanged.

2 голосов
/ 31 июля 2011

Ваш класс задач необходимо реализовать INotifyPropertyChanged

http://msdn.microsoft.com/en-us/library/ms743695.aspx

2 голосов
/ 31 июля 2011

Вы должны привязать свой первый ListBox SelectedItem к объекту Task модели и добавить обработчик событий для SelectionChanged. внутри этого события вы должны заполнить свои журналы выбранной моделью задачи, а также реализовать INotifyPropertyChanged в своем классе.

2 голосов
/ 31 июля 2011

Вашему классу Task необходимо реализовать интерфейс INotifyPropertyChanged , чтобы при появлении каких-либо изменений в базовых данных пользовательский интерфейс WPF мог сообщить, что что-то изменилось, обновите / обновите элементы управления снова

1 голос
/ 10 августа 2011

У меня все это работает сейчас.Я реализовал INotifyPropertyChanged, хотя это не решило проблему.

Я сейчас использую шаблон MVVM.Это помогло ... у библиотеки NoRM, которую я использовал, не было события SelectionChanged.Я создал модель представления и смог преобразовать эти модели в ObservableCollections.Теперь я просто устанавливаю элемент управления Logs DataContext при выборе, измененном для класса Task.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...