0

オブジェクトモデル:クライアントには多くの研究があり、多くの主題には多くの記録があります。ツリービューはクライアント/スタディ/サブジェクトを保持し、レコードはMainDataGridにあります。

問題:データグリッドのRecordオブジェクトの双方向バインディングプロパティの1つを変更すると、Recordオブジェクトのセッターが呼び出されません。この問題の理由を理解するためのwpfバインディングモデル/オブジェクトモデルについてまだ十分に理解していないため、この問題にどのように取り組むかがわかりません。

これはMVVMアプリではありません。コードビハインドでは、_loadedイベント中に、いくつかのデータをロードし、適切に実装されたObservableCollectionを介してTreeViewのデータコンテキストに割り当てます。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>

欠落しているTreeViewItemTemplate:

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

2 に答える 2

1

TextBoxのテキストを変更したらすぐにソースを変更する場合UpdateSourceTriggerは、をに設定する必要があります。defualtPropertyChangedの場合はです。TextBoxLostFocus

<TextBox Text="{Binding YourBinding, UpdateSourceTrigger=PropertyChanged}"/>
于 2012-10-27T12:35:19.203 に答える
0

この質問と非常によく似ていることがわかりました。この問題は、UpdateSourceTriggerをLostFocusに設定することで修正されました。

UpdateSourceTriggerのMSDNによると、これは私には奇妙です。

TwoWayまたはOneWayToSourceであるバインディングは、ターゲットプロパティの変更をリッスンし、それらをソースに伝播します。これは、ソースの更新と呼ばれます。通常、これらの更新は、ターゲットプロパティが変更されるたびに発生します。これは、チェックボックスやその他の単純なコントロールには問題ありませんが、通常、テキストフィールドには適していません。キーストロークごとに更新すると、パフォーマンスが低下する可能性があり、新しい値を確定する前に、ユーザーがバックスペースキーを押して入力エラーを修正する通常の機会を拒否します。したがって、TextプロパティのデフォルトのUpdateSourceTrigger値はLostFocusであり、PropertyChangedではありません。

ですから、なぜそうなるのかわかりません。

于 2012-10-26T19:02:26.077 に答える