我正在尝试创建一个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中绑定如何工作的理解。
答案 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