简体   繁体   English

无法在 DataGridTemplateColumn 中绑定 slider 值

[英]Cannot bind slider value in DataGridTemplateColumn

I am trying to create a DataGrid with two text columns and a template column as follows:我正在尝试创建一个包含两个文本列和一个模板列的 DataGrid,如下所示:

<UserControl
   ...   
   Name="TcpNtcpSliders"
...>
<DataGrid Name="MinTcpDataGrid" AutoGenerateColumns="False" Margin="2" Grid.Row="0"
                  ItemsSource="{Binding MinTcpRows, ElementName=TcpNtcpSliders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Structure ID" IsReadOnly="True" Width="Auto"
                                    Binding="{Binding StructureId, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                <DataGridTextColumn Header="Min. TCP" IsReadOnly="True" Width="Auto" x:Name="MinTcpTextColumn"
                                    Binding="{Binding MinTcpValue, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
                <DataGridTemplateColumn Header="Set Min. Tcp" Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Slider Minimum="0" Maximum="1"
                                    Value="{Binding MinTcpValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
</UserControl>

In the code behind I have在我后面的代码中

internal ObservableCollection<MinTcpRow> MinTcpRows
        {
            get { return (ObservableCollection<MinTcpRow>)GetValue(MinTcpRowsProperty); }
            set { SetValue(MinTcpRowsProperty, value); }
        }

        internal static readonly DependencyProperty MinTcpRowsProperty =
            DependencyProperty.Register("MinTcpRows", typeof(ObservableCollection<MinTcpRow>),
                typeof(RtpOptimizationTcpNtcpSliders),
                new PropertyMetadata(new ObservableCollection<MinTcpRow>(), MinTcpRowsPropertyChangedCallback));

        private static void MinTcpRowsPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var control = (RtpOptimizationTcpNtcpSliders)d;
            control.MinTcpRows = (ObservableCollection<MinTcpRow>)e.NewValue;
            control.CreateTcpNtcpLimits();
        }

and the MinTcpRow class is defined like: MinTcpRow class 的定义如下:

public class MinTcpRow
    {
        public string StructureId { get; }
        public double MinTcpValue { get; set; }

        public MinTcpRow(string structureId, double minTcpValue)
        {
            if (minTcpValue < 0 || minTcpValue > 1)
                throw new ArgumentOutOfRangeException($"{nameof(minTcpValue)} must " +
                                                      $"be in range [0, 1], but was {minTcpValue}.");
            StructureId = structureId ?? throw new ArgumentNullException(nameof(structureId));
            MinTcpValue = minTcpValue;
        }
}

Everything works as expected, except for the Slider value binding.除了 Slider 值绑定外,一切都按预期工作。 I says cannot resolve symbol 'MinTcpValue' .我说cannot resolve symbol 'MinTcpValue' How can I bind the slider's value correctly?如何正确绑定滑块的值?

In order to see what happens I put a simplified version together.为了看看会发生什么,我将一个简化版本放在一起。

In my mainwindow I have a datagrid:在我的主窗口中,我有一个数据网格:

    <DataGrid Name="MinTcpDataGrid" AutoGenerateColumns="False"
              ItemsSource="{Binding Rows}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Structure ID" IsReadOnly="True" Width="Auto"
                                Binding="{Binding StructureId, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
            <DataGridTextColumn Header="Min. TCP" IsReadOnly="True" Width="Auto" x:Name="MinTcpTextColumn"
                                Binding="{Binding MinTcpValue, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
            <DataGridTemplateColumn Header="Set Min. Tcp" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Slider Minimum="0" Maximum="1"
                                Value="{Binding MinTcpValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

MainWindowViewModel will supply my Rows collection: MainWindowViewModel 将提供我的 Rows 集合:

public partial class MainWindowViewModel : ObservableObject
{

    [ObservableProperty]
    private ObservableCollection<MinTcpRow> rows = new ObservableCollection<MinTcpRow>();
    public MainWindowViewModel()
    {
        rows.Add(new MinTcpRow ("A",0.1));
        rows.Add(new MinTcpRow("B", 0.5));
        rows.Add(new MinTcpRow("C", 0.9));
    }
}

And MinTcpRow ( is faulted because it won't notify change ) but looks the same.和 MinTcpRow(因为它不会通知更改而出错)但看起来一样。

public class MinTcpRow
{
    public string StructureId { get; }
    public double MinTcpValue { get; set; }

    public MinTcpRow(string structureId, double minTcpValue)
    {
        if (minTcpValue < 0 || minTcpValue > 1)
            throw new ArgumentOutOfRangeException($"{nameof(minTcpValue)} must " +
                                                  $"be in range [0, 1], but was {minTcpValue}.");
        StructureId = structureId ?? throw new ArgumentNullException(nameof(structureId));
        MinTcpValue = minTcpValue;

And that works, no error anyhow.那行得通,无论如何都没有错误。 There is a memory leak waiting to catch you out because of not implementing inpc but I get no error like you show us.由于没有实现 inpc,有一个 memory 泄漏等着你出来,但我没有收到你向我们展示的错误。 Are you somehow using a different version of MinTcpRow?您是否以某种方式使用了不同版本的 MinTcpRow?

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM