wpf 无法绑定DataGridTemplateColumn中的滑块值

uqjltbpv  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(157)

我正在尝试创建一个具有两个文本列和一个模板列的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>

在后面的代码中我有

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();
        }

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;
        }
}

除了Slider值绑定之外,所有的东西都按预期工作。我说cannot resolve symbol 'MinTcpValue'。我怎样才能正确地绑定Slider的值?

lo8azlld

lo8azlld1#

为了看看会发生什么,我把一个简化的版本在一起。
在主窗口中,我有一个数据网格:

<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将提供我的行集合:

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));
    }
}

和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;

这样就可以工作了,没有任何错误。因为没有实现inpc,所以有一个内存泄漏等待着你,但是我没有得到像你显示的那样的错误。你是在用不同版本的MinTcpRow吗?

相关问题