C# 在WPF中,将数据绑定到另一个xaml文件中的元素最安全的方法是什么

C# 在WPF中,将数据绑定到另一个xaml文件中的元素最安全的方法是什么,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我有一个应用程序,它显示了一个树,可以在其中选择树的节点并将它们添加到列表中。为了保持代码干净,我将TreeView移到了它自己的UserControl(我在几个地方使用了这个树)和xaml文件中。要将节点添加到列表中,我有一个“添加”按钮。但是,当没有选择任何TreeView项时,我想灰显此“添加”按钮。做这件事最明智的方法是什么。我可以绑定到完整的usercontrol并编写一个更复杂的转换器,但这似乎不雅观。有什么简单的解决办法吗 我希望类似“ElementName=xamlFile.Ta

我有一个应用程序,它显示了一个树,可以在其中选择树的节点并将它们添加到列表中。为了保持代码干净,我将TreeView移到了它自己的UserControl(我在几个地方使用了这个树)和xaml文件中。要将节点添加到列表中,我有一个“添加”按钮。但是,当没有选择任何TreeView项时,我想灰显此“添加”按钮。做这件事最明智的方法是什么。我可以绑定到完整的usercontrol并编写一个更复杂的转换器,但这似乎不雅观。有什么简单的解决办法吗


我希望类似“ElementName=xamlFile.TargetElement”这样的东西能起作用……

以下是我的做法。我将有一个Main.Xaml,它将有一个Main_ViewModel.Xaml设置为它的DataContext。在Main.Xaml中,我有一个MyTreeView控件和一个按钮。对于MyTreeViewControl,我还将创建一个MyTreeViewControl_视图模型(将使用INotifyPropertyChanged)。在Main_VeiwModel中,我将创建MyTreeViewControl_ViewModel属性,并使用MyTreeViewControl_ViewModel的新实例对其进行实例化。然后,在Main.xaml中,可以将MyTreeViewControl的DataContext设置为该属性。在主视图模型中,您可以拥有“添加”按钮可见性绑定到的可见性属性。在主视图模型中,您可以订阅MyTreeViewControl视图模型的“PropertyChanged”事件。在这种情况下,您可以检查“SelectedItem”是否发生了更改,如果是,您可以重新评估并设置“添加”按钮的可见性属性


抱歉,我没有时间给出代码示例。如果你真的需要的话,我以后可能会为你安排一些事情。希望这有帮助

命令可在命令无法执行时自动禁用按钮。如果创建命令并在UserControl中为其添加处理程序,则外部添加按钮可以使用该命令

<local:TreeViewControl x:Name="Tree"/>
<Button Content="Add" Command="{x:Static local:TreeViewControl.AddCommand}" CommandTarget="{Binding ElementName=Tree}"/>

如果使用MVVM,您可以使用DelegateCommand或RelayCommand从ViewModel执行类似的操作。

您是否使用MVVM模式?如果是这样的话,我也许可以帮你。是的,或者更确切地说,我将是,因为我目前正在开发一个原型,但我对c#和xaml(来自java)仍然非常陌生。谢谢,这正是我一直在寻找的。。。我上周确实找到了,但还是。。。
public partial class TreeViewControl : UserControl
{
    public static RoutedCommand AddCommand { get; private set; }

    static TreeViewControl()
    {
        AddCommand = new RoutedCommand("AddCommand", typeof(TreeViewControl));
    }

    public TreeViewControl()
    {
        InitializeComponent();

        CommandBindings.Add(new CommandBinding(AddCommand, AddExecuted, AddCanExecute));
    }

    public void AddExecuted(object sender, ExecutedRoutedEventArgs e)
    {
    }

    public void AddCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = false; // your logic here
    }
}