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

时间:2010-05-25 12:50:35

标签: c# wpf xaml binding

我有一个显示树的应用程序,可以选择树的节点并将它们添加到列表中。为了保持代码清洁,我已将TreeView移动到它自己的UserControl(我在几个地方使用这个树)和xaml文件。要将一个节点添加到列表中,我有一个“添加”按钮。但是,当没有选择任何treeviewitems时,我想灰显这个'添加'按钮。这样做最明智的方法是什么?我可以绑定到完整的usercontrol并编写一个更复杂的转换器,但这看起来不太优雅。有没有简单的解决方案?

我希望“ElementName = xamlFile.TargetElement”中的某些内容有用......

2 个答案:

答案 0 :(得分:1)

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

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

命令创建和连接:

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
    }
}

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

答案 1 :(得分:0)

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

抱歉,我没有时间给出代码示例。如果你真的需要的话,我可能会在以后找到适合你的东西。希望这有帮助!