【问题标题】:UWP DataGrid column is bound to nullable double, but modifying the cell does not modify the propertyUWP DataGrid 列绑定为 nullable double,但修改单元格不会修改属性
【发布时间】:2019-07-23 13:42:55
【问题描述】:

如果我更改代码中的属性值,DataGrid 中的单元格会正确更新,但如果我修改单元格本身的值,则属性值不会更改。实际上,如果我修改单元格中的值,它会立即恢复为之前设置的值。

我正在开发一个应用程序,您可以在其中设置电视剧集收视率数据,为此我正在使用这个数据网格。这是相关的 XAML:

<Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBlock Text="Edit Ratings" FontSize="36" Margin="10" TextAlignment="Center"/>
        <controls:DataGrid ItemsSource="{x:Bind NetworkRatings}" Margin="10" AutoGenerateColumns="False" FrozenColumnCount="1" Grid.Row="1">
            <controls:DataGrid.Columns>
                <controls:DataGridTextColumn Header="Show Name" Binding="{Binding ShowName}"/>
                <controls:DataGridTextColumn Header="Episode 1" Binding="{Binding Episode1, Mode=TwoWay, TargetNullValue='null', UpdateSourceTrigger=PropertyChanged}"/>
            </controls:DataGrid.Columns>
        </controls:DataGrid>
</Grid>

我在测试应用程序时更改了 TargetNullValue 以使空值更加明显,但最终它将是一个空白单元格。这是页面背后的代码:

public sealed partial class EditRatings : Page
    {
        ObservableCollection<RatingsContainer> NetworkRatings;
        Network network;

        public EditRatings()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            network = (Network)e.Parameter;

            NetworkRatings = network.NetworkRatings;
        }
    }

这里是 RatingsContainer 类

class RatingsContainer : INotifyPropertyChanged
    {

        public string ShowName { get; } 

        List<double?> Ratings;             

        public double? Episode1
        {
            get
            {
                return Ratings[0];
            }
            set
            {
                Ratings[0] = value;
                OnPropertyChanged("Episode1");
            }
        }

        public RatingsContainer(Show s)
        {
            ShowName = s.name;

            Ratings = s.ratings;  //List of 26 double? values   

        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }

到目前为止,我只处理了 26 集中的一集。我最初只是想直接处理列表或数组,但我不知道如何对类似的东西执行 propertynotify所以我决定最终将它们全部分离到它们自己的属性中。

所以 PropertyNotify 似乎工作正常,因为我可以从后面的代码更新属性,它会自动刷新数据网格上的新值。但是,由于某种原因,直接在数据网格中修改单元格似乎根本不会触发属性的 set 方法。我在这里错过了一些非常明显的东西吗?如果我将 ShowName 属性设置为可设置,那修改就好了。如果我将 Episode1 属性设置为常规双精度而不是可空双精度,它也可以正常工作,但我需要该空值来表示还没有评级的剧集。当我从一个空值开始时,当我更改单元格中的值并单击另一个单元格时,它立即返回为空。如果我从一个值开始,或者以编程方式设置一个值,那么在我输入其他内容后它会自动切换回该值。

作为参考,这是我的第一个 UWP 应用,在此之前,我在多年前使用 WPF 的经验有限。如果我错过了一些明显的东西,我不会感到惊讶,但我整晚都在谷歌上搜索这个问题,但没有取得多大成功。看来我的具体问题要么很难找到,要么不太常见。

【问题讨论】:

    标签: c# xaml data-binding uwp datagrid


    【解决方案1】:

    我想通了。我不知道为什么这行得通,而另一种方式则行不通,但我决定创建一个 Nullable Value Converter 并在 XAML 中使用它而不是 TargetNullValue。这个问题似乎是我以前的方法是一种方式而不是两种方式。 TargetNullValue 在从属性读取空值时工作,但由于某种原因,它完全无法将我输入的任何数据存储回属性,因此使用值转换器似乎已经解决了这个问题。

    如果有人知道为什么以前的方法不起作用,我仍然会感谢任何跟进的 cmets。

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 2017-05-02
      • 1970-01-01
      • 2012-06-17
      • 2016-03-19
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多