Как получить TextBox внутри DataTemplate в ListBox, чтобы уведомить ViewModel об изменении значения - PullRequest
1 голос
/ 22 сентября 2010

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

Таким образом, в основном, когда пользователь редактирует текстовое поле внутри списка, модель представления будет уведомлена об изменении значений.

Причина в том, что мне нужно просмотреть все мои записи и обновить что-то, как элементы внутри таблицы изменений списка.

Любое предложение?

В моем XAML есть следующее.

<ListBox x:Name="EntriesListBox"
         ItemsSource="{Binding Path=Entries}"
         Grid.Row="1">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <ComboBox x:Name="EntriesPropertyName"
                          Width="215"
                          Margin="0,0,5,0"
                          SelectedItem="{Binding Path=Property, Mode=TwoWay}"
                          ItemsSource="{Binding Source={StaticResource DataContextProxy},Path=DataSource.EntityTypeProperties}" />               
                <TextBox x:Name="EntriesPropertyValue"
                         Width="215"
                         Margin="0,0,5,0"
                         Text="{Binding Path=Value, Mode=TwoWay, BindsDirectlyToSource=True}" />                                   
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

В моей виртуальной машине есть следующее (ViewModel.cs)

public ObservableCollection<Entry> Entries { get; set; }

В моем бизнес-объекте есть следующее (Entry.cs)

public class Entry
{
  public PropertyItem Property { get; set; }
  public string Value { get; set; }
}

Ответы [ 3 ]

1 голос
/ 22 сентября 2010

В привязке установите UpdateSourceTrigger ... Также реализуйте INotifyPropertyChanged

0 голосов
/ 22 сентября 2010

Это похоже на работу. Есть ли причина не делать это таким образом?

private void EntriesPropertyValue_TextChanged(object sender, TextChangedEventArgs e)
{
    (sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();

    this.ViewModel.UpdateFinalQuery();
}
0 голосов
/ 22 сентября 2010

При условии, что вы правильно настроили класс модели представления (путем реализации INotifyPropertyChanged), вам может потребоваться следующее:

 <TextBox x:Name="EntriesPropertyValue"
                         Width="215"
                         Margin="0,0,5,0"
                         Text="{Binding Path=Value, Mode=TwoWay, BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged}" /> 
...