0

WPF フォームで問題なく AutoCompleteBox を使用しました。ここで、WPF DataGrid 内で同じことをしたいと思います。SelectedItem のセッターを除いて、ほとんどすべてが機能します。ゲッターが呼び出されるのを見ますが、値を入力してタブを押す (または矢印キーを使用する) と、セッターは呼び出されません。コンソール出力にバインディング エラーは表示されません。私が間違っていることと、SelectedItem が DataGrid 内にあるときに ViewModel クラスのプロパティでセッターを起動する方法を誰かが教えてくれることを願っています。まず、ViewModel クラスのスニペット:

    public static List<ImpaSimple> AllImpas { get { return ImpaListRepository.ImpaList; } }
    private ImpaSimple _selectedImpa;

    public ImpaSimple SelectedImpa
    {
        get { return _selectedImpa; }
        set
        {
            if (value == _selectedImpa) return;
            _selectedImpa = value;
            //Manually set Description and Unit fields because user can override the IMPA default values.
           // Description = _selectedImpa.Name;
            //TODO Set Units too
            RaisePropertyChanged("SelectedImpa");
        }
    }

XAML

以下の XAML では、一時的な回避策として LostFocus のコード ビハインド ハンドラーを追加しました。UpdateSourceTrigger 属性の追加も、これを機能させるための試みでした。

<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
    <TextBlock  Style="{StaticResource DataGridHeader}">LImpa</TextBlock>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Hots:AutoCompleteBoxEx ToolTip="Start typing an IMPA number"
                                ItemsSource="{Binding AllImpas}"
                                Width="50"
                                HorizontalContentAlignment="Left"
                                FilterMode="StartsWith"
                                IsDropDownOpen="True"
                                IsTextCompletionEnabled="True"
                                LostFocus="ImpaBoxExLostFocus"
                                SelectedItem="{Binding SelectedImpa, 
                                                        Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <Hots:AutoCompleteBoxEx.ItemTemplate>
                <DataTemplate>
                    <Grid Width="450">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50" />
                            <ColumnDefinition Width="275" />
                            <ColumnDefinition Width="50" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding ImpaId}"
                                   Grid.Column="0" />
                        <TextBlock Text="{Binding Name}"
                                   Grid.Column="1" />
                        <TextBlock Text="{Binding Unit}"
                                   Grid.Column="2" />
                    </Grid>
                </DataTemplate>
            </Hots:AutoCompleteBoxEx.ItemTemplate>
        </Hots:AutoCompleteBoxEx>

    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

4

1 に答える 1

0

ああ、私はそれが何であるかを知っていると思います-私が「恥ずかしがり屋のデータコンテキスト」と呼んでいる欠陥-Hots:AutoCompleteBoxEx DataContextを次のように設定してみてください:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YourDataSourceItemType}}}"

それを確認する方法は、ダミーのコンバーターを作成し、そのように使用することです。

ItemsSource="{Binding Converter={StaticResource DummyConverter}}"

次に、Convert 内にブレークポイントを配置し、値を確認します。Path が指定されていないため、入力値は DataContext 自体であり、null の場合、設定/失われることはありません。

于 2012-01-05T20:10:53.280 に答える