簡體   English   中英

將命令綁定到 DataGrid 中的元素

[英]Binding Command to element in DataGrid

我有一個表,其中包含一個包含 bool 值的列,我在其中放置了一個復選框。我試圖將命令綁定到復選框,當我選中它時,它會在視圖模型中運行一個命令。 我正在使用 MVVM 結構。 這是我迄今為止所嘗試的。

<DataGrid 
                    IsReadOnly="True" 
                    Margin="0,10,0,0" 
                    ItemsSource="{Binding Diary.Diaries}" 
                    AutoGenerateColumns="False"
                    MinHeight="200" 
                    SelectionMode="Single"
                    SelectionUnit="FullRow"
                    IsSynchronizedWithCurrentItem = "True"
                    >
                    <DataGrid.Columns>
                        <DataGridTemplateColumn Header="Flagged">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Grid >
                                        <CheckBox IsChecked="{Binding Flagged}" Command="{Binding Diary.FlagDiary}">
                                        </CheckBox>
                                    </Grid>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn >

                        <DataGridTextColumn Header="Diary ID" Binding="{Binding DiaryID}" />       
                    </DataGrid.Columns>

                </DataGrid>

這是 ViewModel 中的 RelayCommand。

FlagDiary = new RelayCommand(() =>
{
    Debug.WriteLine("Test");
});

我一直無法讓它運行 RelayCommand。 知道我做錯了什么嗎?

Checkbox 的 DataContext 將設置為 DataGrid 的 ItemSource 中的對象之一(Diary.Diaries 條目之一)。 這使得命令綁定無效。

您將需要進行相對源綁定,以便您可以訪問 Diary.FlagDiary。 這是一種方法(考慮到您在上面發布的 xaml)。

<CheckBox IsChecked="{Binding Flagged}"
    Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.Diary.FlagDiary}" />

一旦命令觸發,您可能想知道復選框對應哪個日記條目......對嗎? 為此,請將 CommandParameter 綁定添加到復選框。 現在,綁定看起來像這樣:

<CheckBox IsChecked="{Binding Flagged}"
    Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.Diary.FlagDiary}"
    CommandParameter="{Binding}" />

您的中繼命令代碼也可能需要更改。 大概是這樣的?

FlagDiary = new RelayCommand((parameter) =>
{
    Debug.WriteLine(parameter.ToString());
});

暫無
暫無

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

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