C# 绑定源不';设置从代码隐藏文件的绑定时不会更改

C# 绑定源不';设置从代码隐藏文件的绑定时不会更改,c#,xaml,uwp,win-universal-app,C#,Xaml,Uwp,Win Universal App,因此,我有一个程序,我主要使用x:Bind进行所有绑定,但我有一个控制页面,需要在其中生成大量滑块,以便能够操作存储在可观察集合中的数据 我真的需要从我的代码中生成这些滑块,因为我需要大约100个滑块,手工创建它们会把我的xmal文件搞得一团糟 这就是我在代码中创建绑定的方式。当我第一次加载它们时,它们也可以工作。但当我移动滑块时,它们不会更改源数据 private void CreateGrid() { for (var parameterNumberIndex = 1; parame

因此,我有一个程序,我主要使用
x:Bind
进行所有绑定,但我有一个控制页面,需要在其中生成大量
滑块
,以便能够操作存储在
可观察集合中的数据

我真的需要从我的代码中生成这些滑块,因为我需要大约100个滑块,手工创建它们会把我的xmal文件搞得一团糟

这就是我在代码中创建绑定的方式。当我第一次加载它们时,它们也可以工作。但当我移动滑块时,它们不会更改源数据

private void CreateGrid()
{
    for (var parameterNumberIndex = 1; parameterNumberIndex < 97; parameterNumberIndex++)
    {
        var paraName = new TextBlock()
        {
            Name = $"Parameter{parameterNumberIndex}",
            FontSize = 25,
            VerticalAlignment = VerticalAlignment.Top,
            Margin = new Thickness(0, 0, 0, 10)
        };

        var slider = new Slider()
        {
            Name = $"ValueSlider{parameterNumberIndex}",
            Width = 200,
            VerticalAlignment = VerticalAlignment.Center,
            HorizontalAlignment = HorizontalAlignment.Center
        };

        var value = new TextBox()
        {
            Name = $"ValueBox{parameterNumberIndex}",
            Margin = new Thickness(10, 5, 0, 0),
            FontSize = 20,
            VerticalAlignment = VerticalAlignment.Top
        };

        var row = new RowDefinition { Height = new GridLength(50, GridUnitType.Pixel) };

        SettingsGrid.RowDefinitions.Add(row);

        var nameBinding = new Binding
        {
            Source = ViewModel.BlockCollection.NamesBlock.Names[parameterNumberIndex].NameString,
            Mode = BindingMode.OneWay
        };

        var valueBinding = new Binding()
        {
            Source = ViewModel.BlockCollection.ParameterBlock.Parameters[parameterNumberIndex].ParameterValue,
            Mode = BindingMode.TwoWay
        };

        var minBinding = new Binding()
        {
            Source = ViewModel.BlockCollection.MinMaxBlock.AllValues[parameterNumberIndex].MinValue,
            Mode = BindingMode.OneWay
        };

        var maxBinding = new Binding()
        {
            Source = ViewModel.BlockCollection.MinMaxBlock.AllValues[parameterNumberIndex].MaxValue,
            Mode = BindingMode.OneWay
        };

        var textBinding = new Binding()
        {
            Path = new PropertyPath("Value"),
            Source = slider,
            Mode = BindingMode.TwoWay
        };

        BindingOperations.SetBinding(paraName, TextBlock.TextProperty, nameBinding);
        BindingOperations.SetBinding(slider, Slider.MinimumProperty, minBinding);
        BindingOperations.SetBinding(slider, Slider.MaximumProperty, maxBinding);
        BindingOperations.SetBinding(slider, Slider.ValueProperty, valueBinding);
        BindingOperations.SetBinding(value, TextBox.TextProperty, textBinding);

        SettingsGrid.Children.Add(paraName);
        SettingsGrid.Children.Add(slider);
        SettingsGrid.Children.Add(value);

        Grid.SetColumn(paraName, 0);
        Grid.SetColumn(slider, 1);
        Grid.SetColumn(value, 2);

        Grid.SetRow(paraName, parameterNumberIndex - 1);
        Grid.SetRow(slider, parameterNumberIndex - 1);
        Grid.SetRow(value, parameterNumberIndex - 1);
    }
}
这几乎是我完成这个项目之前需要解决的最后一步,我不想被困在这里:/

我不知道wpf标签是否有误。但是每次我查找xaml引用时,我都会在wpf的东西上绊倒,它在某种程度上是可用的。因此,如果它是错误的,告诉我,我删除它

再解释一下。。。在成品中,它将取决于我接收到的数据,以决定是否有滑块或文本框

这是我昨天提出的另一个问题的一个小例子:


我看到您正在
网格中添加控件,手动生成行。虽然这当然可以工作,但最好使用列表控件并在以下范围内创建项:

<ItemsControl ItemsSource="{x:Bind Data}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!-- your Sliders, etc. -->
        </DataTemplate>
    </ItemsControl.ItemTemplate>
<ItemsControl>


如果数据在多个布局之间可能不同,您可以实现一个
DataTemplateSelector
类,覆盖
SelectTemplateCore(对象项,DependencyObject容器)
(具体地说,这个方法是另一个名称相同但参数数量不同的方法,它没有被调用)并为每个项目确定正确的模板。您可以使用
x:Key
创建多个
DataTemplates
作为资源,然后从
DataTemplateSelector
中引用它们。有关示例和更多详细信息,请参见此。

我看到您正在
网格中添加控件,手动生成行。虽然这当然可以工作,但最好使用列表控件并在以下范围内创建项:

<ItemsControl ItemsSource="{x:Bind Data}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!-- your Sliders, etc. -->
        </DataTemplate>
    </ItemsControl.ItemTemplate>
<ItemsControl>


如果数据在多个布局之间可能不同,您可以实现一个
DataTemplateSelector
类,覆盖
SelectTemplateCore(对象项,DependencyObject容器)
(具体地说,这个方法是另一个名称相同但参数数量不同的方法,它没有被调用)并为每个项目确定正确的模板。您可以使用
x:Key
创建多个
DataTemplates
作为资源,然后从
DataTemplateSelector
中引用它们。有关示例和更多详细信息,请参见此。

“我需要大约100个”听起来像应该在ItemsControl中。它不仅仅是滑块。先这样测试比较容易。根据输入的数据,我可能还需要一个文本框或一个切换开关。我对ItemsControl不是很熟悉,但它在这种情况下可用吗?还是仅当我只有一种特定类型的元素时才可用?如果不将ItemsControl的ItemTemplate设置为固定的DataTemplate(如答案所示),则可以为不同的项类型显示不同的DataTemplate。源项集合可能声明为
ObservableCollection
。然后只需将带有DataType属性的DataTemplates声明为资源。从这里开始阅读:“‘我需要大约100个’听起来好像它们应该在ItemsControl中,而不仅仅是滑块。先这样测试比较容易。根据输入的数据,我可能还需要一个文本框或一个切换开关。我对ItemsControl不是很熟悉,但它在这种情况下可用吗?还是仅当我只有一种特定类型的元素时才可用?如果不将ItemsControl的ItemTemplate设置为固定的DataTemplate(如答案所示),则可以为不同的项类型显示不同的DataTemplate。源项集合可能声明为
ObservableCollection
。然后只需将带有DataType属性的DataTemplates声明为资源。从这里开始阅读:。这绝对比我的方法好:D我在使绑定工作时遇到了一些问题,我仍然必须实现
DataTemplateSelector
,但到目前为止,我确实对它有多好印象:D这绝对比我的方法好:D我在使绑定工作时遇到了一些问题,我仍然必须实现
DataTemplateSelector
,但到目前为止,我对它的性能印象深刻:D