如何将listview选中的项绑定到其他控件?

时间:2016-02-25 06:10:32

标签: c# wpf data-binding

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

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

Listview有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 ???}"/>

1 个答案:

答案 0 :(得分:1)

如果WaveCollectionObservableCollection<WaveForm>。如果像WaveForm这样的Frequency类属性看起来像这样(实现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)}