0

OK、Silverlight MVVM Light アプリに次の XAML マークアップがあります。これはビューの一部です。ビューのコード ビハインドの btnClearBodyMark のクリック イベントで、.Parent プロパティを使用してツリーを上方向にトラバースしようとしました。最初の親は水平スタックパネル、次にその親は垂直スタックパネル、その親はグリッドですが、その後グリッドの親は別のグリッドですか?? ボタンが属する ListBoxItem への参照を取得するにはどうすればよいですか?

<ListBox Name="listboxBodyMarkValues" ItemsSource="{Binding}" Height="Auto" Width="Auto" SelectionChanged="listboxBodyMarkValues_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <StackPanel x:Name="stackBodyMarkList" Orientation="Vertical" Margin="5" Height="Auto">
                    <StackPanel Orientation="Horizontal" Margin="5" Height="Auto">
                        <TextBlock x:Name="txtId" Width="50" Height="Auto" Margin="10" HorizontalAlignment="Left" VerticalAlignment="Center" FontWeight="Bold" Text="{Binding Id}" />
                        <ComboBox x:Name="comboDom1" Width="100" Margin="5" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding Dom1}" SelectedItem="{Binding Dom1SelectedItem, Mode=TwoWay}" Visibility="{Binding ComboIsVisible}"/>
                        <Button x:Name="btnClearBodyMark" Content="Delete Body Mark" Margin="5" HorizontalAlignment="Left" VerticalAlignment="Center" Click="btnClearBodyMark_Click" />                                         
                    </StackPanel>
                    <TextBox x:Name="txtNotes" VerticalAlignment="Stretch" VerticalContentAlignment="Top" HorizontalAlignment="Stretch" TextWrapping="Wrap" Text="{Binding ManualText, Mode=TwoWay}" AcceptsReturn="True" Margin="5" MaxWidth="400" MaxHeight="200" VerticalScrollBarVisibility="Auto" IsEnabled="{Binding ManualTextIsEnabled}" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
4

2 に答える 2

0

通常、MVVM では、Commandをバインドする場合、 CommandParameterを渡し、その中にDataContextを入れることができますが、最も重要なことは、「 DataContext 」を渡すことです。これは Click イベントに関連付けられているため、送信者をボタンとして型キャストし、DataContext にアクセスすると、これがリストボックス内のオブジェクトになるはずです。したがって、リストボックスが「Customers」のItemsSourceにバインドされている場合、ボタンの「 DataContext」は「Customer」オブジェクトである必要があります。StackPanel の DataContext がそのオブジェクトになり、そのすべての子が同じオブジェクトを持つ必要があるため、これを渡す必要があります。例えば:

public void btnClearBodyMark_Click(object sender, ButtonClickEventArgs e)
{
    var myRef = (sender as Button).DataContext;
}

そんな感じ。
PSこれはおそらく一連の「オブジェクト」にバインドされているためです。アイテムはもはや ListBoxItem ではなく、バインドされたコレクションのデータ型です。また、 Mode=TwoWayのモードで、ListBox のSelectedItemプロパティを ViewModel のプロパティに
バインドすると、「SelectionChanged」イベントの作業を自分で保存できます。ViewModelの「SelectedListItem」などのプロパティが、ViewModelがSystem.ComponentModelにあるINotifyPropertyChangedを実装していることを確認して、プロパティ変更イベントを通知するようにしてください。そうすれば、ユーザーが何かを選択すると、偶数ハンドラーは必要ありません;)。

于 2012-04-29T23:34:34.473 に答える
0

私もそれで苦労しました。補足として: ListBoxItem を渡す必要はありません。ビューモデルは、リストがどのように実装されているかを気にする必要はありません。

ここで私を本当に助けてくれたのは、MVVM-Light ツールキットでした。(ListBoxItem の DataContext の型の) 1 つのパラメーターを受け入れる独自のコマンドを作成し、目的のイベントでそれを実行できます。

詳細はこちら: http://www.galasoft.ch/mvvm/#tutorials

于 2012-04-29T23:52:46.103 に答える