7

背景:データグリッドを使用してデータを表示するプロジェクトがあり、データグリッドにはユーザーコントロールを含む行詳細列があります。ユーザーコントロールには、ユーザーがメッセージを入力して表示するための TextBox があります。

問題:ボタンをクリックしたときにユーザーコントロールをポップアップさせたいのですが、ポップアップされたユーザーコントロールは、データグリッドのrowdetail列にあるユーザーコントロールと同じコンテキストを持っています。これは、rowdetail セルのスペースが限られているため、ユーザーがユーザー コントロールと簡単に対話できるようにすることを目的としています。

usecontrol が実装されており、rowdetail セルで正常に機能します。ただし、データソース、テキストボックスにメッセージが表示されているなど、コンテキストを変更せずにポップアップする方法がわかりません。誰かアドバイスをいただけますか? ちなみに、私はMVVMパターンを使用しています。

編集: RowDetailTemplate は次のとおりです。

    <DataTemplate x:Key="RowDetailTemplate">
    <Grid x:Name="RowDetailGrid" HorizontalAlignment="Left" Width="850" Height="355" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="100" />
        </Grid.ColumnDefinitions>
        <my:MyUserControl x:Name="myUserControl" />
        <Button Grid.Row="1" Width="60" Height="25" Content="Pop Up" 
                    Command="{Binding Path=PopupCommand}"/>
        .....
    </Grid>
</DataTemplate>

これがユーザーコントロールです(上記のコードの MyUserControl ):

<UserControl x:Class="MyProject"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="600">
<Grid>
    <ScrollViewer  Margin="0" HorizontalScrollBarVisibility="Disabled" >
        <StackPanel>
            <ItemsControl Grid.Row="0" ItemsSource="{Binding Output, Mode=OneWay}" FontSize="12">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                            <TextBlock TextWrapping="Wrap" Text="{Binding Path=.}" Foreground="White" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <DockPanel Grid.Row="1" LastChildFill="True">                    
                <TextBox Text="{Binding Input, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                     TextWrapping="Wrap"
                     BorderBrush="{x:Null}" SelectionBrush="{x:Null}" 
                     BorderThickness="0" Width="Auto">
                    <TextBox.InputBindings>
                        <KeyBinding Command="{Binding Path=TextBoxEnter}" Key="Enter" />
                    </TextBox.InputBindings>
                </TextBox>
            </DockPanel>
        </StackPanel>
    </ScrollViewer>
</Grid>

4

2 に答える 2

9

コントロールを使用できますPopupPopupおそらくボタンをクリックしたときに、データグリッドの現在の行にアタッチして、ポップアップを作成し、現在の行のいずれかのセルの子として配置するのが適切です。
その後、ユーザーコントロールをポップアップに追加できます次に、ポップアップを「表示」します。このようにして、ポップアップの DataContext、したがってユーザーコントロールの DataContext は、データグリッド内の含まれている行から継承されます。

Popup以下は、 XAML のみを使用した非常に単純なコントロールの実装です。

<StackPanel>
  <CheckBox Name="chk1"/>
  <Popup IsOpen="{Binding IsChecked, ElementName=chk1}">
    <Border Background="White">
      <TextBlock Margin="20" Text="I'm Popped Up!"/>
    </Border>
  </Popup>
</StackPanel>

IsOpenポップアップはスタックパネルに含まれていますが、チェックボックスがチェックされている場合にのみ表示されます。境界線とテキストブロックを配置したポップアップにユーザーコントロールを配置します。ポップアップはスタックパネルのメンバーであるため、独自の DataContext がない場合は自動的にスタックパネルの DataContext を使用します。

あなたのインスタンスでは、私が示しているスタックパネルは DataGrid 行に似ています。

于 2013-09-10T13:32:24.773 に答える
1

さて、ゲート・ルマスのコメントについてコメントしたいのですが、システムがそれを許可しないので、これを回答として書き留めておきます。

XAML ポップアップ サンプル:リンクのアーカイブ| 元のリンク

そのサンプルをダウンロードして、Senario1 の .xaml ファイルと .cs ファイルを確認すると、ポップアップの使用方法と実装方法の完全な例が得られます。または、サイト上のコードをブラウズすることもできますが、サンプルを実行して操作できる方が、コードを見るだけよりも役立つことがわかりました。

于 2014-01-22T02:27:22.963 に答える