WPF DataGridCell样式绑定问题

时间:2014-08-19 09:37:20

标签: c# wpf binding datagrid styles

我正面临一个奇怪的问题,将Collection绑定到DataGrid,在选择行时,绑定似乎消失了(我有一个空单元格)

这是我的对象列表

public ReadOnlyCollection<ItemPoint> CurrentItemPoints { get; private set; }

ItemPoint对象定义为:

public sealed class ItemPoint : PropertyChangedNotifierBase
{        
    private bool _IsSubscribed = false;
    private string _Name = string.Empty;
    private string _Value = string.Empty;
    private DateTime _ValueTime = DateTime.UtcNow;

    public bool IsSubscribed
    {
        get { return _IsSubscribed; }
        set
        {
            if (_IsSubscribed != value)
                ChangeSubscription(value);
            ChangeProperty("IsSubscribed", ref _IsSubscribed, value);
        }
    }

    public string Name
    {
        get { return _Name; }
        private set
        {
            ChangeProperty("Name", ref _Name, value);
        }
    }

    public string Value
    {
        get { return _Value; }
        set
        {
            _Value = value;
        }
    }

    public DateTime ValueTime
    {
        get { return _ValueTime; }
        private set
        {
            ChangeProperty("ValueTime", ref _ValueTime, value);
        }
    }
}

这是我的xaml:

    <DataGrid Name="PointsList" VerticalAlignment="Stretch"  HorizontalAlignment="Stretch" Margin="2,0,0,0"
              ItemsSource="{Binding CurrentItemPoints, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding Path=IsSubscribed, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"  Width="10">
                <DataGridCheckBoxColumn.CellStyle>
                    <Style>
                        <EventSetter Event="CheckBox.Checked" Handler="SubscriptionCheckBox_Checked"/>
                    </Style>
                </DataGridCheckBoxColumn.CellStyle>
            </DataGridCheckBoxColumn>
            <DataGridTextColumn Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Header="Name"  Width="*"/>
            <DataGridTextColumn Binding="{Binding Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, IsAsync=True, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"  Header="WorkingValueColumn" Width="*"/>
            <DataGridTextColumn  Binding="{Binding Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, IsAsync=True, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"  Header="NonWorkingValueColumn" Width="*">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type DataGridCell}">
                                    <ContentPresenter/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=ValueTime, UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True, Mode=OneWay, StringFormat='{}{0:dd-MM-yyyy HH:mm:ss.fff}'}" Header="Time"  Width="*">
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

如果我现在显示数据网格一切正常......直到我选择网格的任何单元格。

这样做我将使“WorkingValueColumn”运行良好...这意味着将继续显示所选项目值,而“NonWorkingValueColumn”将显示一个空单元格...

以下是datagrid部分示例的截图: Datagrid with cell ko on selection

我一直在寻找一段时间而没有找到任何解释......我虽然可能错过了一些选择模板或类似的东西,但我真的不知道。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我终于可以解决由DataTemplateColumn改变DataTextColumn的奇怪行为:

<DataGridTemplateColumn Header="Value">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                       <TextBlock Text="{Binding Value, UpdateSourceTrigger=PropertyChanged, Mode=OneWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" HorizontalAlignment="Stretch"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" BorderThickness="0" HorizontalAlignment="Stretch"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>