簡體   English   中英

在WPF中將數據綁定到另一個xaml文件中的元素的最安全方法是什么

[英]What is the safest way of databinding to an element in another xaml file in WPF

我有一個顯示樹的應用程序,可以在其中選擇樹的節點並將其添加到列表中。 為了保持代碼干凈,我將TreeView移到了它自己的UserControl(我在幾個地方都使用了此樹)和xaml文件中。 要將節點添加到列表,我有一個“添加”按鈕。 但是,當未選擇任何treeviewitems時,我希望將此“添加”按鈕顯示為灰色。 什么是最明智的方式做到這一點。 我可以綁定到完整的usercontrol並編寫一個更復雜的轉換器,但這似乎並不優雅。 有沒有簡單的解決方案?

我本來希望像“ ElementName = xamlFile.TargetElement”這樣的東西能起作用...

當命令無法執行時,命令會使用它們來自動禁用按鈕。 如果創建命令並在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執行類似的操作。

這就是我要做的。 我將擁有一個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中,您可以具有“添加”按鈕可見性綁定到的Visibility屬性。 在Main_ViewModel中,您可以訂閱MyTreeViewControl_ViewModel的'PropertyChanged'事件。 在這種情況下,您可以檢查“ SelectedItem”是否發生了更改,如果發生更改,則可以重新評估並設置“添加”按鈕的“可見性”屬性。

抱歉,我沒有時間給出代碼示例。 如果您確實需要,我以后可以為您准備一些東西。 希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM