2012-10-26 68 views
0

對象模型: 客戶端有很多研究,有很多學科有很多記錄。樹視圖包含客戶/研究/主題,記錄位於MainDataGrid中。在TreeView的SelectedItem中修改Collection中的對象

問題:當我在數據網格中的Record對象上修改其中一個雙向綁定屬性時,Record對象上的setter永遠不會被調用。我不確定如何處理這個問題,因爲我仍然不太瞭解wpf綁定模型/對象模型以找出原因。

這不是MVVM應用程序。在代碼隱藏中,在_loaded事件期間,我加載了一些數據,並通過一個良好實施的ObservableCollection將其分配給TreeView的datacontext。 在TreeView的SelectedItemChanged事件上,我加載相關記錄和連接屬性更改的處理程序。

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:HPA.Studies.MCA.Client" 
Title="Medra Coding Assistant" Height="800" Width="1250" MouseRightButtonDown="HandleRightClick"> 
<Window.Resources> 
    <local:HistoryTypeConverter x:Key="HistoryTypeConverter" /> 
    <DataTemplate x:Key="MedraValuesTemplate"> 
     <UniformGrid Columns="2" Rows="5"> 
      <TextBlock Grid.Row="0" Grid.Column="0" Text="MedDRA LLT:" /> 
      <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding CodeValue2, Mode=TwoWay}"/> 
      <TextBlock Grid.Row="1" Grid.Column="0" Text="MedDRA PT:" /> 
      <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding CodeValue1, Mode=TwoWay}"/> 
      <TextBlock Grid.Row="2" Grid.Column="0" Text="MedDRA HLT:" /> 
      <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding CodeValue3, Mode=TwoWay}"/> 
      <TextBlock Grid.Row="3" Grid.Column="0" Text="MedDRA HLGT:" /> 
      <TextBox Grid.Row="3" Grid.Column="1" Text="{Binding CodeValue4, Mode=TwoWay}"/> 
      <TextBlock Grid.Row="4" Grid.Column="0" Text="MedDRA SOC:" /> 
      <TextBox Grid.Row="4" Grid.Column="1" Text="{Binding CodeValue5, Mode=TwoWay}"/> 
     </UniformGrid> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="8*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <StackPanel Grid.Row="0" Grid.ColumnSpan="3"> 
     <TextBlock Text="Medra Coding Assistant" FontSize="15" FontWeight="Bold" /> 
     <TextBlock Text="Available Batches:" /> 
    </StackPanel> 
    <Grid x:Name="BindingRootGrid" Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*"/> 
      <ColumnDefinition Width="5*"/> 
      <ColumnDefinition Width="4*"/> 
     </Grid.ColumnDefinitions> 
     <TreeView x:Name="tvClients" Grid.Column="0" ItemTemplate="{StaticResource NavigatorTemplate}" ItemsSource="{Binding}"> 
     </TreeView> 
     <GridSplitter Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Left" Width="6" Panel.ZIndex="1" /> 
     <DataGrid x:Name="MainDataGrid" Grid.Column="1" AutoGenerateColumns="False" 
        DataContext="{Binding ElementName=tvClients, Path=SelectedItem}" ItemsSource="{Binding Path=Records}"> 
      <DataGrid.Columns> 
       <DataGridHyperlinkColumn Header=" " /> 
       <DataGridTextColumn Header="Discrim" Binding="{Binding Discriminator, Mode=OneWay}" /> 
       <DataGridTextColumn Header="Field Name" Binding="{Binding FieldName, Mode=OneWay}" /> 
       <DataGridTextColumn Header="Field Value" Binding="{Binding FieldValue, Mode=OneWay}" Width="160"> 
        <DataGridTextColumn.ElementStyle> 
         <Style> 
          <Setter Property="TextBlock.TextWrapping" Value="Wrap" /> 
          <Setter Property="TextBlock.TextAlignment" Value="Center"/> 
         </Style> 
        </DataGridTextColumn.ElementStyle> 
       </DataGridTextColumn> 
       <DataGridTemplateColumn Header="MedDRA Value" CellTemplate="{StaticResource MedraValuesTemplate}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
     <GridSplitter Grid.Column="2" VerticalAlignment="Stretch" HorizontalAlignment="Left" Width="6" Panel.ZIndex="1" /> 
     <DataGrid x:Name="HistoryDataGrid" Grid.Column="2" AutoGenerateColumns="False" 
        DataContext="{Binding ElementName=MainDataGrid, Path=SelectedItem, Mode=OneWay}" ItemsSource="{Binding Path=HistoryList}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="DateTime" Binding="{Binding Path=TimeStamp, Mode=OneWay}"/> 
       <DataGridTextColumn Header="Event Type" Binding="{Binding Path=Description, Converter={StaticResource HistoryTypeConverter}, Mode=OneWay}"/> 
       <DataGridTextColumn Header="Data" Binding="{Binding Path=Data, Mode=OneWay}" Width="80"> 
        <DataGridTextColumn.ElementStyle> 
         <Style> 
          <Setter Property="TextBlock.TextWrapping" Value="Wrap" /> 
          <Setter Property="TextBlock.TextAlignment" Value="Center"/> 
         </Style> 
        </DataGridTextColumn.ElementStyle> 
       </DataGridTextColumn> 
       <DataGridTextColumn Header="User" Binding="{Binding Path=UserName, Mode=OneWay}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
    <Border Grid.Row="2" Grid.ColumnSpan="3"> 
     <TextBlock Text="Control Panel Goes here" /> 
    </Border> 
</Grid> 

失蹤TreeView控件的ItemTemplate:

<HierarchicalDataTemplate x:Key="BatchesTemplate" ItemsSource="{Binding Formats}"> 
    <TextBlock Text="{Binding Path=BatchName}" /> 
    <HierarchicalDataTemplate.ItemTemplate> 
     <HierarchicalDataTemplate> 
      <TextBlock Text="{Binding Name}" /> 
     </HierarchicalDataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 
</HierarchicalDataTemplate> 

回答

0

原來與this question非常相似。通過將UpdateSourceTrigger設置爲LostFocus解決了該問題。

這是怪我,因爲根據MSDN on UpdateSourceTrigger

綁定是雙向或OneWayToSource監聽目標屬性的更改,並傳播他們回到源。這被稱爲更新源。通常,只要目標屬性更改就會發生這些更新。這適用於複選框和其他簡單控件,但它通常不適用於文本字段。在每次擊鍵之後更新會降低性能,並拒絕用戶在提交新值之前退格和修復打字錯誤的常見機會。因此,Text屬性的默認UpdateSourceTrigger值是LostFocus,而不是PropertyChanged。

所以我不確定爲什麼會出現這種情況。

1

如果要在更改文本框中的文本後立即更改源,則需要將UpdateSourceTrigger設置爲PropertyChanged。對於TextBox默認爲LostFocus

<TextBox Text="{Binding YourBinding, UpdateSourceTrigger=PropertyChanged}"/> 
+0

根據文檔,你是正確的,請參閱我的文章和MSDN報價。我不明白爲什麼LostFocus默認不工作。 – dansan