如果之前已经问过这个问题,请道歉,但我无法在任何地方找到解决方案。
我正在开发一个具有Instrument
类和Note
类的音乐应用程序(C#,WPF)。 Instrument
包含用于调整的Note
列表。
我创建了一个简单的自定义NoteSelector
控件,如下所示:
我的问题是我不能双向将注释绑定到控件的SelectedNote
属性。
控件的代码如下所示:
[TemplatePart(Name = "PART_UpButton", Type = typeof(Button))]
[TemplatePart(Name = "PART_DownButton", Type = typeof(Button))]
public class NoteSelector : Control
{
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (_upButton != null) _upButton.Click -= Up;
if (_downButton != null) _downButton.Click -= Down;
_upButton = GetTemplateChild("PART_UpButton") as Button;
_downButton = GetTemplateChild("PART_DownButton") as Button;
if (_upButton != null) _upButton.Click += Up;
if (_downButton != null) _downButton.Click += Down;
}
public Note SelectedNote
{
get { return (Note)GetValue(SelectedNoteProperty); }
set { SetValue(SelectedNoteProperty, value); }
}
public static readonly DependencyProperty SelectedNoteProperty =
DependencyProperty.Register("SelectedNote", typeof(Note), typeof(NoteSelector), new PropertyMetadata(new Note()));
Button _upButton;
Button _downButton;
public void Up(object sender, EventArgs e)
{
SelectedNote += 1;
CheckUpDown();
}
public void Down(object sender, EventArgs e)
{
SelectedNote -= 1;
CheckUpDown();
}
public void CheckUpDown()
{
_upButton.IsEnabled = true;
_downButton.IsEnabled = true;
// Check for minimum or maximum
if (_upButton != null && SelectedNote.GetValue() >= Note.MaxValue) _upButton.IsEnabled = false;
if (_downButton != null && SelectedNote.GetValue() <= Note.MinValue) _downButton.IsEnabled = false;
}
}
这种单向绑定有效:
<ItemsControl ItemsSource="{Binding Tuning}" Margin="0,-5,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:NoteSelector Margin="0,5,0,0" SelectedNote="{Binding }"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是如果我改为双向绑定,我会收到错误“ System.Windows.Markup.XamlParseException:''双向绑定需要Path或XPath。'”
如果绑定是字段而不是属性,我只知道发生了这种情况,但SelectedNote显然是一个依赖属性,所以我不知道发生了什么。
我将不胜感激任何帮助。 感谢。