将WPF按钮直接绑定到另一个Element的方法

时间:2017-05-12 16:35:46

标签: c# wpf xaml data-binding

我正在尝试创建一个WPF按钮,它会直接增加DatePicker控件中的日期,而不会在后面的代码中使用click事件处理程序。

我已经像这样扩展了DatePicker类,如果在后面的代码中使用它,它会按预期工作:

XMLParser.__init__()

我试图在我的XAML中使用以下绑定,但是我无法让它工作:

public class ChronicleDatePicker : DatePicker
{
    public void IncreaseDay()
    {
        SelectedDate = SelectedDate.Value.AddDays(1);
    }
}

我也尝试了以下内容:

<local:ChronicleDatePicker x:Name="dtWorkingDayPicker" SelectedDate="{x:Static sys:DateTime.Now}" />
<Button Command="{Binding IncreaseDay}" CommandParameter="{Binding ElementName=dtWorkingDayPicker}">Boop</Button>

Command="{Binding ElementName=dtWorkingDayPicker, Path=IncreaseDay}"

但没有运气!谷歌今天也不善待我。

感谢任何人都能给予的帮助!感谢

编辑: 感谢建设性的批评和建议 - 澄清我并没有特别想避免使用C#,只是试图在XAML CS文件中避免过多的代码并学习更多关于绑定的知识。不可否认,我相信我想要实现的目标比它更简单,将代码保留在我的视图模型中可能是有意义的,而不是仅仅在XAML中尝试这样做。

我很欣赏人们提供的代码,它有助于增加我对WPF中绑定如何工作的理解。

2 个答案:

答案 0 :(得分:1)

要绑定命令,您需要一个实现ICommand的属性。无法直接绑定到方法。有几种方法可以解决您的问题...这是一种可能的解决方案:

您可以使用Button创建附加属性以连接 DatePicker。您可以在MSDN找到介绍。这是一个可能的实现:

public static class ButtonProperties
{
    public static readonly DependencyProperty IncreaseDatePickerProperty =
        DependencyProperty.RegisterAttached(
            "IncreaseDatePicker",
            typeof(DatePicker),
            typeof(ButtonProperties),
            new UIPropertyMetadata(IncreaseDatePickerPropertyChanged));

    public static DatePicker GetIncreaseDatePicker(Button b)
    {
        return (DatePicker)b.GetValue(IncreaseDatePickerProperty);
    }

    public static void SetIncreaseDatePicker(Button b, DatePicker value)
    {
        b.SetValue(IncreaseDatePickerProperty, value);
    }

    private static void IncreaseDatePickerPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        Button b = (Button)sender;
        b.Click -= B_Click;
        b.Click += B_Click;
    }

    private static void B_Click(object sender, RoutedEventArgs e)
    {
        DatePicker picker = GetIncreaseDatePicker((Button)sender);
        picker.SelectedDate = picker.SelectedDate.Value.AddDays(1);
    }
}

使用如下属性:

<DatePicker x:Name="picker"/>
<Button Content="Increase" local:ButtonProperties.IncreaseDatePicker="{Binding ElementName=picker}"/>

答案 1 :(得分:1)

除了以下内容之外,您的所有代码都是正确的: 修改ChronicleDatePicker类,如下所示:

internal class ChronicleDatePicker : DatePicker
{
    Command cmd = new Command();
    public ICommand IncreaseDay
    {
        get
        {
            return cmd;
        }
    }
}

class Command :ICommand
{

    internal DateTime? selectedDate = null;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        var picker = ((ChronicleDatePicker)parameter);
        picker.SelectedDate = picker.SelectedDate.Value.AddDays(1);
    }
}

您应该从您的IncreaseDay属性返回ICommand,因为Button Command的绑定属性应该返回ICommand

.xaml中的小变化

1)在Button命令中添加元素名称为

Command =&#34; {Binding IncreaseDay, ElementName = dtWorkingDayPicker }&#34;

因为您必须告诉IncreaseDay

中存在class