簡體   English   中英

WPF DataGridTemplateColumn-復選框IsChecked屬性的觸發器

[英]WPF DataGridTemplateColumn - Trigger for CheckBox IsChecked Property

我正在創建一個帶有DataGridTemplateColumn CheckBox的WPF DataGrid控件,該DataGridTemplateColumn應將IsChecked屬性設置為truefalse取決於DataTable值)。

如果DataTable行的值設置為1 ,則DataGridTemplateColumn應該為true (選中)。 否則,它將為false (未選中)...默認情況下,每個新行都將設置為true ,但是我無法將這些CheckBox行綁定到我的DataTable值(將為12

我嘗試了以下c#代碼。 當我完成UserControl版本並遍歷DataTable以保存其值時,它可以工作。但是,當我設置gridResultados.ItemsSource = dataTable.DefaultView時,顯然不檢查/取消選中我的CheckBoxes因為在DataTable列值之間沒有綁定( 1或2)和我的DataGridTemplateColumn ...這是我最接近的方法:

<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Value?" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="True" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked">
                <Style TargetType="{x:Type CheckBox}">
                    <Style.Triggers>
                        <Trigger Property="Content" Value="1">
                            <Setter Property="IsChecked" Value="True"/>
                        </Trigger>
                        <Trigger Property="Content" Value="2">
                            <Setter Property="IsChecked" Value="False"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </CheckBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    dataTable.Rows[gridResultados.SelectedIndex].SetField(4, 1);
}

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    dataTable.Rows[gridResultados.SelectedIndex].SetField(4, 2);
}

首先,我建議您不要在WPF中使用DataTable ,因為我們通常在WPF中使用EF, DataTable是ADO.NET的一部分,並且它已過時且已過時。

對於您的問題,您需要解決一些與綁定和觸發器有關的問題。 首先,這里每行中的隱式DataContextDataRowView 僅適用於DataTrigger使用(不適用於Trigger )。 因此,您需要使用DataTrigger來監聽索引[4] (它引用第五列DataTrigger的列)。 其次,您設置的Style錯誤,應將其包裝在CheckBox.Style以使您了解為CheckBox而不是為其Content設置了Style。 第三, Style觸發器不能覆蓋本地設置的IsChecked (如您的代碼中一樣),在這種情況下,模板觸發器可以覆蓋它,但是您也可以使用樣式設置器為IsChecked設置默認值True 這是您應具有的代碼:

<DataGridTemplateColumn Header="Value?">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked">
            <CheckBox.Style>
               <Style TargetType="{x:Type CheckBox}">
                  <Setter Property="IsChecked" Value="True"/>
                  <Style.Triggers>
                    <DataTrigger Binding="{Binding [4]}" Value="1">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding [4]}" Value="2">
                        <Setter Property="IsChecked" Value="False"/>
                    </DataTrigger>
                  </Style.Triggers>
              </Style>
            <CheckBox.Style>
        </CheckBox>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

順便說一句,我可以看到您使用事件處理程序來更新基礎數據的值。 但是,就MVVM而言,這不是正確的方法,因為您幾乎需要的是綁定和相關內容。 但是,那部分是您的,您需要對此進行更多研究。 我認為在這里結束這個問題就足夠了。

暫無
暫無

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

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