亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

數據上下文在 DataGridTemplateColumn 中不可用

數據上下文在 DataGridTemplateColumn 中不可用

C#
不負相思意 2023-09-16 17:40:08
我有以下網格:<DataGrid     x:Name="CandiesDataGrid"     ItemsSource="{Binding Candies}"     SelectedItem="{Binding SelectedCandy}">    <i:Interaction.Triggers>        <i:EventTrigger EventName="SelectionChanged">            <i:InvokeCommandAction Command="{Binding CandySelectedCommand}"/>        </i:EventTrigger>    </i:Interaction.Triggers>    <DataGrid.Columns>        <DataGridTextColumn KeyboardNavigation.IsTabStop="False" IsReadOnly="True" Width="100" Header="{l:LocText Candy_Prop1}" Binding="{Binding CandyInfo.Name}"/>        <DataGridTemplateColumn >            <DataGridTemplateColumn.CellTemplate>                <DataTemplate>                    <CheckBox Name="IsConfirmed" Grid.Column="0"                        Style="{StaticResource CandyCheckBox}"                        IsChecked="{Binding IsConfirmed, Mode=TwoWay}"                        Margin="-75 0 0 0"                        Command="{Binding IsConfirmedCommand}">                    </CheckBox>                </DataTemplate>            </DataGridTemplateColumn.CellTemplate>        </DataGridTemplateColumn>    </DataGrid.Columns></DataGrid>我的財產使用OnPropertyChanged. 它不僅不改變 的值IsConfirmed,而且也不執行ICommand IsConfirmedCommand.我在網上搜索了一下,似乎DataGridTemplateColumn丟失ItemSource了datagrid。我確實嘗試在復選框RelativeSource后輸入mode=TwoWay,但它不起作用。有什么方法可以訪問我的 TemplateColumn 中的 ItemSource 嗎?
查看完整描述

1 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

在 CellTemplate 中,DataContext 是 DataGrid 行,無論它是什么(Candy在本例中)。因此,默認情況下,該Candy實例將是Source該 DataTemplate 中任何 Binding 的屬性。綁定將在此處查找 Path 中指定的屬性(在本例中IsConfirmed為 和IsConfirmedCommand)。


這就是您想要的:網格中有多于一行,而該行通常是您在單元格中關心的內容。該字段或字段:但單元格模板通常需要查看多個字段,因此它們會為您提供整行。


但在這種情況下,您想要返回并從父視圖模型中獲取一些內容。Viewmodel 沒有自然的父/子層次結構,但如果您愿意,您可以給它們一個層次結構:Candy 可以擁有一個Parent引用擁有該Candies集合的 viewmodel 的屬性。如果你這樣做了,你可以像這樣綁定:


Command="{Binding Parent.IsConfirmed}"

但這并不常見。我不知道這是否是一個特別好的主意。


我們不需要這樣做的原因之一是我們可以告訴綁定使用不同的源。UI 元素確實具有自然的父/子層次結構,并且綁定可以對其進行導航。如果你做得正確,你的父視圖模型將是某個地方的 DataContext。


{Binding Path=DataContext.IsConfirmed, 

        RelativeSource={RelativeSource AncestorType=DataGrid}}

“向上遍歷 UI 樹,直到找到 DataGrid。這就是您的源。現在,一旦有了源,就找到源對象的 DataContext 屬性(如果有)。如果它有 DataContext,則獲取 DataContext 的值并查看該對象對于一些名為 IsConfirmed 的屬性?!?/p>


DataGrid 有一個 DataContext 屬性。由于您的綁定有效Candies,我們知道 DataContext 必須是具有屬性的類Candies。你向我保證班級IsConfirmed也有。


因此:


<DataTemplate>

    <CheckBox 

        Style="{StaticResource CandyCheckBox}"

        IsChecked="{Binding DataContext.IsConfirmed, 

            RelativeSource={RelativeSource AncestorType=DataGrid}}"

        Margin="-75 0 0 0"

        Command="{Binding DataContext.IsConfirmedCommand,

            RelativeSource={RelativeSource AncestorType=DataGrid}}"

        />

</DataTemplate>


查看完整回答
反對 回復 2023-09-16
  • 1 回答
  • 0 關注
  • 100 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號