如何将列表视图选定项绑定到其他控件
本文关键字:绑定 其他 控件 列表 视图 | 更新日期: 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 ???}"/>
如果WaveCollection
是ObservableCollection<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)}