如何在ListBox中的DataTemplate中获取TextBox以通知ViewModel值的更改

时间:2010-09-22 04:00:28

标签: silverlight xaml viewmodel mvvm

我需要找到的是当文本框的值发生变化或者我的datatemplate项目中的下拉列值发生变化时,我需要在我的ViewModel.cs中收到通知。

因此,基本上当用户编辑列表框中的文本框时,视图模型将在值发生变化时收到通知。

原因是我需要遍历所有条目并更新内容作为列表框的datatemplate更改内的项目。

任何建议?

我的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>

以下是我的VM(ViewModel.cs)

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

以下是我的业务对象(Entry.cs)

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

3 个答案:

答案 0 :(得分:1)

在您的绑定上,设置UpdateSourceTrigger ...同时实施INotifyPropertyChanged

答案 1 :(得分:0)

如果您已正确设置视图模型类(通过实现INotifyPropertyChanged),您可以执行以下操作:

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

答案 2 :(得分:0)

这似乎有效。有什么理由不这样做吗?

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

    this.ViewModel.UpdateFinalQuery();
}