簡體   English   中英

Silverlight MVVM-基於按鈕的單擊事件,從View代碼背后獲取對ListBoxItem的引用

[英]Silverlight MVVM - Get reference to ListBoxItem from View codebehind based on a button's click event

好的,我在Silverlight MVVM Light應用程序中具有以下XAML標記。 這是視圖的一部分。 在視圖代碼背后的btnClearBodyMark的click事件中,我嘗試使用.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>

通常,在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,而是綁定集合的數據類型。
同樣,如果將ListBox的SelectedItem屬性綁定到ViewModel中的屬性(模式為Mode = TwoWay) ,則可以節省“ SelectionChanged”事件的工作。 確保您的屬性,例如ViewModel中的“ SelectedListItem”,通過確保您的ViewModel實現我認為在System.ComponentModel中找到的INotifyPropertyChanged來通知屬性更改事件。 這樣,一旦用戶選擇了某個東西,就不需要一個偶數處理程序了;)。

我也為此感到掙扎。 附帶說明:您不應傳遞ListBoxItem。 視圖模型不關心列表的實現方式。

真正幫助我解決問題的是MVVM-Light工具包。 您可以創建自己的命令來接受一個參數(屬於ListBoxItem的DataContext類型),然后在所需的事件上執行它。

此處的詳細信息: http : //www.galasoft.ch/mvvm/#tutorials

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM