如何将列表视图选定项绑定到其他控件

本文关键字:绑定 其他 控件 列表 视图 | 更新日期: 2023-09-27 18:36:11

考虑我有一个包含 10 个项目的集合。 列表视图绑定到此集合。 因此,列表视图中将显示 10 个项目。

列表视图选择模式设置为单个项目。一次只能选择一个项目。

列表视图有 3 列。频率、幅度和相位。这些属性中的每一个都应该由工具说滑块控制。因此,当用户拖动滑块时,应更改所选项的属性。

所以我想将选定的项目属性绑定到一些滑块。我能够在代码后面做到这一点。这似乎很丑陋,我想知道在 XAML 中是否可行。

简化的模型是这样的。(仅显示一个属性)

internal class Waveform : INotifyPropertyChanged
{
    public double Frequency { get; set; }
    private void Initialize()
    {
        FreqBinding = new Binding
        {
            Source = this,
            Path = FreqPath,
            Mode = BindingMode.TwoWay
        };
    }
    public Binding FreqBinding { get; private set; } // binding used to bind this item to frequency slider
    private static readonly PropertyPath FreqPath = new PropertyPath(nameof(Frequency));
}

这是滑块之一。

<Slider x:Name="FreqSlider"/>

当列表视图所选索引更改时,将触发该事件。

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Toolbox.IsEnabled = ListView.SelectedIndex >= 0;
    if (Toolbox.IsEnabled)
    {
        ResetBindings((Waveform)ListView.SelectedItem);
    }
    else
    {
        BindingOperations.ClearAllBindings(FreqSlider);
    }
}
private void ResetBindings(Waveform obj)
{
    FreqSlider.SetBinding(RangeBase.ValueProperty, obj.FreqBinding);
}

这是针对工具箱中的所有 3 个控件完成的。 我想知道是否可以在 XAML 中完成所有这些操作?

为了使它更清楚一点。 这是我拥有的当前 XAML 代码。 简化。

<ListView x:Name="ListView" ItemsSource="{Binding WaveCollection, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Frequency" DisplayMemberBinding="{Binding Frequency, StringFormat=0.#### Hz}"/>
        </GridView>
    </ListView.View>
</ListView>

现在正在寻找一种执行此绑定的方法。

<Slider x:Name="FreqSlider" Value="{Binding ???}"/>

如何将列表视图选定项绑定到其他控件

如果WaveCollectionObservableCollection<WaveForm> .如果像Frequency这样的类属性看起来像这样WaveForm(实现NotifyPropertyChanged)。

private double _freq;
public double Frequency
{
    get { return _freq; }
    set { _freq = value; NotifyPropertyChanged( "Frequency" ); }
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
protected void NotifyPropertyChanged( String info )
{
    if ( PropertyChanged != null )
    {
        PropertyChanged( this, new PropertyChangedEventArgs( info ) );
    }
}

您可以像这样为滑块编写Binding

{Binding ElementName=ListView, Path=SelectedItem.Frequency}

更新或如评论中所述

{Binding ElementName=ListView, Path=SelectedItem.(local:Waveform.Frequency)}