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>
通常,在 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