WPF自定义控件上的双向绑定

时间:2017-05-14 15:17:37

标签: c# wpf xaml binding

如果之前已经问过这个问题,请道歉,但我无法在任何地方找到解决方案。

我正在开发一个具有Instrument类和Note类的音乐应用程序(C#,WPF)。 Instrument包含用于调整的Note列表。

我创建了一个简单的自定义NoteSelector控件,如下所示:

enter image description here

我的问题是我不能双向将注释绑定到控件的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显然是一个依赖属性,所以我不知道发生了什么。

我将不胜感激任何帮助。 感谢。

0 个答案:

没有答案