【问题标题】:Binding gives UnsetValue on multiple binding绑定在多个绑定上给出 UnsetValue
【发布时间】:2017-03-30 11:22:53
【问题描述】:

我有一个数据网格,它从数据表中获取数据,例如 如果有一个带有上下文菜单的文本框并且这个上下文菜单有一个转换器(带有多重绑定),那么里面 问题是我的数据表绑定的数据有 1 或 0 作为数据,但在转换器中我得到 UnsetValue。 这是 xaml 代码:

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch"  VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True"  Margin="0,1,0,0" x:Name="TrackingDataGrid" IsReadOnly="True" CanUserAddRows="False"  CanUserDeleteRows="False"  IsManipulationEnabled="True"  CanUserResizeColumns="False" ItemsSource="{Binding TrackingTable}" ColumnHeaderStyle="{DynamicResource dataGridColumnStyle}"  Style="{DynamicResource dataGridStyle}"  EnableColumnVirtualization="True"  IsEnabled="True" BorderThickness="0" CellStyle="{DynamicResource CellStyleBase}" VerticalGridLinesBrush="#FFA0A7AD"  RowHeight="30" MinRowHeight="20" GridLinesVisibility="None" SelectionMode="Single" Grid.Row="1" Grid.ColumnSpan="10" Panel.ZIndex="4" MinHeight="30" Loaded="TrackingDataGrid_Loaded" CanUserReorderColumns="False" VerticalScrollBarVisibility="Disabled" ScrollViewer.CanContentScroll="True">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Process Time" IsReadOnly="True"  Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock   Text="{Binding DeliveryDate}" TextTrimming="CharacterEllipsis" >
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem x:Name="StandbyProcessMenuITem" Header="StandBy Process" Click="StandbyProcessMenuITem_Click" >
                                    <!--<MenuItem.Visibility>
                                            <MultiBinding Converter="{StaticResource RowUndoButtonVisibility}">
                                                <Binding Path="ProductIsStandby" />
                                                <Binding Path="ProductIsDone" />
                                            </MultiBinding>
                                        </MenuItem.Visibility>-->
                                </MenuItem>
                                <MenuItem x:Name="UndoProcessMenuITem" Header="Undo Process" Click="UndoProcessMenuITem_Click" >
                                    <MenuItem.Visibility>
                                        <MultiBinding Converter="{StaticResource RowUndoButtonVisibility}">
                                            <Binding Path="{Binding ProductIsStandby}" />
                                            <Binding Path="{Binding ProductIsDone}" />
                                        </MultiBinding>
                                    </MenuItem.Visibility>
                                </MenuItem>
                                <MenuItem x:Name="FinishProcessMenuITem" Header="Finish Process" Click="FinishProcessMenuITem_Click">
                                </MenuItem>
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

【问题讨论】:

  • 我认为这是正常的预期行为。对于 DataTable 中的新行,每一列都是 DBNull,它将作为 UnsetValue 呈现给转换器。因此,在这种情况下,也许您应该将 UnsetValue 解释为 0。
  • 只有 20-30% 的行具有 0 值。其余的是 1。但我得到 100% UnsetValue。我什至尝试绑定另一列 varchar 。但我得到了 Unsetvalue。
  • 您在单元格模板中声明上下文菜单是否有原因?通常上下文菜单在 DataGrid.ContextMenu 中声明。我有一种感觉,它可能会开始工作。我现在没有时间制作它的原型。稍后会尝试。还要在输出窗口中查看绑定错误。这可能会为您提供有关问题所在的线索。
  • 数据网格有自己的 ContextMenuItems。这个特定的文本框需要自己的上下文菜单,并基于它是否已完成其项目更改。

标签: c# wpf datatable binding multibinding


【解决方案1】:

MenuItemDataContextCellTemplateDataContext 不同,但您可以使用RelativeSource 绑定到ContextMenuPlacementTarget

<MenuItem x:Name="UndoProcessMenuITem" Header="Undo Process" Click="UndoProcessMenuITem_Click" >
    <MenuItem.Visibility>
        <MultiBinding Converter="{StaticResource RowUndoButtonVisibility}">
            <Binding Path="{Binding PlacementTarget.DataContext.ProductIsStandby, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
            <Binding Path="{Binding PlacementTarget.DataContext.ProductIsDone, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
        </MultiBinding>
    </MenuItem.Visibility>
</MenuItem>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2011-10-04
    • 2018-07-10
    相关资源
    最近更新 更多