考虑我有一个包含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 ???}"/>
答案 0 :(得分:1)
如果WaveCollection
是ObservableCollection<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)}