Silverlight MVVM - 根据按钮的单击事件从视图代码隐藏中获取对 ListBoxItem 的引用

本文关键字:隐藏 代码 获取 引用 ListBoxItem 视图 事件 MVVM 按钮 Silverlight 单击 | 更新日期: 2023-09-27 18:32:32

好的,我在Silverlight MVVM Light应用程序中有以下XAML标记。 这是视图的一部分。 在视图代码隐藏中 btnClearBodyMark 的单击事件中,我尝试使用 .父属性,第一个父级是水平堆栈面板,然后它的父级是垂直堆栈面板,它的父级是网格,但是网格的父级是另一个网格??如何获取对按钮所属的列表框项的引用???

<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>

Silverlight MVVM - 根据按钮的单击事件从视图代码隐藏中获取对 ListBoxItem 的引用

通常,在 MVVM 中,如果您绑定了 Command,则可以传递 CommandParameter 并在其中放置 DataContext,但最重要的事情是传递">DataContext"。 由于它与 Click 事件相关联,因此将发送方类型转换为按钮,使用 DataContext,这应该是列表框中的对象。 因此,如果您的列表框绑定到"客户"的 ItemsSource,则按钮上的">数据上下文"应该是"客户"对象。 它应该被传递下来,因为 StackPanel 的 DataContext 将是那个对象,它的所有子对象都应该具有相同的对象。 例如:

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

类似的东西。
附言,因为这很可能绑定到一组"对象"。 该项不再是 ListBoxItem 本身,而是绑定集合的数据类型。
此外,如果将 ListBox 的 SelectedItem 属性绑定到 ViewModel 中的属性,模式为 Mode=TwoWay,则可以保存"SelectionChanged"事件的工作。 确保您的属性(例如 ViewModel 中的"SelectedListItem"(通过确保您的 ViewModel 实现 INotifyPropertyChanged 来通知属性更改事件,我认为这可以在 System.ComponentModel 中找到。 这样,一旦用户选择了某些内容,就不需要均匀的处理程序;)。

我也为此苦苦挣扎。作为旁注:您不应该传递 ListBoxItem。视图模型不应该关心列表是如何实现的。

真正帮助我的是MVVM-Light工具包。您可以创建自己的命令,该命令接受一个参数(属于 ListBoxItem 的 DataContext 的类型(,然后在所需的事件上执行该参数。

详情请见:http://www.galasoft.ch/mvvm/#tutorials