簡體   English   中英

XAML:如何將DependencyProperty綁定到另一個對象上同名的C#屬性?

[英]XAML: How can I bind a DependencyProperty to a C# property of the same name on a different object?

使用:

  • Visual Studio Community Edition 2015
  • .Net 4.0

我已經實現了這個答案 ,生成了我自己的CheckBox類,其中包含一個IsChecked DependencyProperty 該屬性由WPF CheckBox上的IsChecked屬性支持,或者如果它可以工作。 工作意味着在切換復選框時會調用我的getter和setter。

如果我將我的屬性重命名為IsChecked_temp並修改XAML以匹配,它可以正常工作。 我認為這是一個命名沖突,但為什么ElementName不解決它? 我的最小測試用例如下。

編輯0:我忘了提,我沒有錯誤或警告。

編輯1: 這個答案最初被接受,因為它適用於測試用例,但它顯然不是完整的答案。 將它應用於我的項目(並將CheckBox類重命名為ToggleBox )會在每次使用該屬性時產生XamlParseException

無法在“ToggleBox”類型的“IsChecked”屬性上設置“綁定”。 '綁定'只能在DependencyObject的DependencyProperty上設置。

我會試着讓一個最小的測試用例來展示這個。

CheckBox.xaml

<UserControl x:Class="CheckBox_test.CheckBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="Self">
    <StackPanel>
        <CheckBox IsChecked="{Binding IsChecked, ElementName=Self}" />
    </StackPanel>
</UserControl>

CheckBox.xaml.cs

using System.Windows;
using System.Windows.Controls;

namespace CheckBox_test
{
    public partial class CheckBox : UserControl
    {
        public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
             "IsChecked",
             typeof(bool),
             typeof(CheckBox),
             new FrameworkPropertyMetadata(false,
                     FrameworkPropertyMetadataOptions.AffectsRender));

        public bool IsChecked
        {
            get { return (bool)GetValue(IsCheckedProperty); }
            set { SetValue(IsCheckedProperty, value); }
        }

        public CheckBox()
        {
            InitializeComponent();
        }
    }
}

MainWindow.xaml

<Window x:Class="CheckBox_test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:CheckBox_test">
    <Grid>
        <local:CheckBox />
    </Grid>
</Window>

MainWindow.xaml.cs (完整性)

using System.Windows;

namespace CheckBox_test
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

非常有趣的問題(至少對我而言)所以事實證明,當你注冊你的依賴屬性時,確實存在名稱沖突。

我不確定這是否是一個答案,但我認為如果你以前不知道或想到它,你會覺得這很有趣。

我使用過“CheckBox.IsChecked”,但任何唯一的名稱都可能就足夠了。

public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
         "CheckBox.IsChecked",
         typeof(bool),
         typeof(CheckBox),
         new FrameworkPropertyMetadata(false,
                 FrameworkPropertyMetadataOptions.AffectsRender));

這不會改變您的財產名稱

public bool IsChecked
{
    get
    {
        return (bool)GetValue(IsCheckedProperty);
    }
    set
    {
        SetValue(IsCheckedProperty, value);
    }
}

為依賴項屬性創建名稱時,必須選擇未用於依賴項屬性的唯一名稱或從中繼承的任何基類中的事件; 否則,在運行時拋出ArgumentException。 有關依賴項屬性和活動綁定的詳細信息,請參閱自定義活動綁定示例和簡單活動示例。

https://msdn.microsoft.com/en-us/library/vstudio/ms734499(v=vs.90).aspx

還有一個提醒我有多大的菜鳥我:)

暫無
暫無

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

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