gpt4 book ai didi

wpf - 从用户控件外部绑定(bind)到命令

转载 作者:行者123 更新时间:2023-12-05 00:08:49 30 4
gpt4 key购买 nike

我有一个简单的用户控件,其中包含标签、组合框和按钮。简而言之,它将在我的几乎所有 View 中多次使用,每次都使用我的 ViewModel 属性的绑定(bind)提供不同的 ItemsSource 和 CreateItemCommand。

标签和组合框是另一个用户控件 (LabeledComboBox) 的一部分,它工作得很好。

问题是,当我尝试在包含我的 UserControl 的窗口中绑定(bind)命令时,出现以下异常:

A 'Binding' cannot be set on the 'CreateItemCommand' property of type 'MutableComboBox'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.



这是 MutableComboBox 的 XAML:
<UserControl x:Class="Albo.Presentation.Templates.MutableComboBox"
x:Name="MCB"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:Albo.Presentation.Templates" >
<StackPanel Height="25" Orientation="Horizontal">
<uc:LabeledComboBox x:Name="ComboBoxControl"
Label = "{Binding ElementName=MCB, Path=Label}"
ItemsSource="{Binding ElementName=MCB, Path=ItemsSource}"
SelectedItem="{Binding ElementName=MCB, Path=SelectedItem}" />
<Button x:Name="CreateItemButton"
Grid.Column="1" Width="25" Margin="2,0,0,0"
Content="+" FontFamily="Courier" FontSize="18"
VerticalContentAlignment="Center"
Command="{Binding ElementName=MCB, Path=CreateItemCommand}"/>
</StackPanel>
</UserControl>

这是它的代码隐藏:
public partial class MutableComboBox : UserControl
{
public MutableComboBox()
{
InitializeComponent();
}

public string Label
{
get { return this.ComboBoxControl.Label; }
set { this.ComboBoxControl.Label = value; }
}

#region ItemsSource dependency property
public static readonly DependencyProperty ItemsSourceProperty =
ItemsControl.ItemsSourceProperty.AddOwner(
typeof(MutableComboBox),
new PropertyMetadata(MutableComboBox.ItemsSourcePropertyChangedCallback)
);

public IEnumerable ItemsSource
{
get { return (IEnumerable)GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}

public static void ItemsSourcePropertyChangedCallback(
DependencyObject controlInstance,
DependencyPropertyChangedEventArgs e)
{
MutableComboBox myInstance = (MutableComboBox)controlInstance;

myInstance.ComboBoxControl.ItemsSource = (IEnumerable)e.NewValue;
}
#endregion // ItemsSource dependency property

#region SelectedItem dependency property
// It has just the same logic as ItemsSource DP.
#endregion SelectedItem dependency property

#region CreateItemCommand dependency property

public static readonly DependencyProperty CreateItemCommandProperty =
DependencyProperty.Register(
"MutableComboBoxCreateItemCommandProperty",
typeof(ICommand),
typeof(MutableComboBox)
);

public ICommand CreateItemCommand
{
get { return (ICommand)GetValue(CreateItemCommandProperty); }
set { SetValue(CreateItemCommandProperty,value); }
}

#endregion // CreateItem dependency property
}

如您所见,我使用两种不同的方法来注册我的 DP:ItemsSource 来自 ItemsControl DP,而 CreateItemCommand 由 DependencyProperty.Register(...) 创建。我尝试使用 Button.CommandProperty.AddOwner(...) 但有同样的异常(exception)。

这是我尝试绑定(bind)的方法:
<Window ...
xmlns:uc="clr-namespace:Albo.Presentation.Templates">
<uc:MutableComboBox Label="Combo"
ItemsSource="{Binding Path=Recipients}"
CreateItemCommand="{Binding Path=CreateNewRecipient}"/>
</Window>

窗口的 DataContext 设置为适当的 ViewModel,它提供了一个 ObservableCollection 的 Recipients 和一个 ICommand CreateNewRecipient 作为简单的属性。

我究竟做错了什么?在这种特殊情况下,我唯一想要的是公开一个 Button.Command 属性以在我的 UserControl 之外使用,就像 ItemsSource 一样。我是否试图以错误的方式使用命令?如何从其他控件或窗口绑定(bind)到我的 UserControls 的命令?

把我当成一个拥有这个 Command 和 DependencyProperty 东西的新手。任何帮助,将不胜感激。谷歌搜索了一整晚,没有发现任何对我有用的东西。原谅我的英语。

最佳答案

您为依赖项属性注册了错误的名称。它应该是:

public static readonly DependencyProperty CreateItemCommandProperty =
DependencyProperty.Register(
"CreateItemCommand",
typeof(ICommand),
typeof(MutableComboBox)
);

注意字符串是“CreateItemCommand”。你应该通读 this MSDN documentation有关依赖属性约定的详细信息。

关于wpf - 从用户控件外部绑定(bind)到命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1211590/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com