【问题标题】:Access Indirect property from XAML - WPF从 XAML 访问间接属性 - WPF
【发布时间】:2019-07-14 13:08:12
【问题描述】:

我有一个名为 MyControl 的控件类,它具有直接 bool 属性 AccessDirectProperty 和一个对象 MyControlSettings

    public class MyControl : Control
    {
        public bool AccessDirectProperty
        {
            get; set;
        }
        public MyControlSettings ControlSettings
        {
            get;set;
        }
    }

请查找MyControlSettings类详细信息

public class MyControlSettings
{
    public bool AccessIndirectProperty
    {
        get;set;
    }
}

可以从 XAML 访问直接属性 AccessDirectProperty 而不会出现任何错误。

<Window>
    <Grid>
        <local:MyControl AccessDirectProperty="True"/>
    </Grid>
</Window>

但我无法从 XAML 中的对象 ControlSettings 访问属性 AccessIndirectProperty。下面的代码无法做到这一点。

<Window>
    <Grid>
        <local:MyControl AccessDirectProperty="True" ControlSettings.AccessIndirectProperty=""/>
    </Grid>
</Window>

谁能帮我解决这个问题?

【问题讨论】:

  • 因为ControlSettings.AccessIndirectProperty 不是MyControl 的属性/成员...
  • 旁注:如果您打算绑定MyControl 的某些属性——这些属性是绑定目标——你需要将这些属性设为DependencyProperties...跨度>
  • 是的,我需要在 XAML 中设置 AccessIndirectProperty。有没有办法使用 MyControl 的属性 ControlSettings 来实现它?
  • 您能否提供一个使用 DependencyProperties 来实现上述要求的示例?
  • 我不知道你想要达到什么目标,所以我不能告诉你应该做什么。但也许您可以将ControlSettings.AccessIndirectProperty 设为附加属性,通过该属性可以操作 MyControl 及其关联的 MyControlSettings 实例。或者您可以在 XAML 中创建一个完整的 MyControlSettings 实例并将其设置为 &lt;MyControl&gt;&lt;ControlSettings&gt;&lt;MyControlSettings SomeProperty="true"/&gt;&lt;/ControlSettings&gt;&lt;/MyControl&gt; 请注意,这会创建并分配一个新的 MyControlSettings 对象,它不会修改现有的 MyControlSettings 对象

标签: c# wpf xaml binding dependency-properties


【解决方案1】:

恐怕 XAML 不支持访问“嵌套”属性。

但是,您可以使用 attached properties 使 ControlSettings 成为一个独立的类:

public class ControlSettings : DependencyObject
{
    public static readonly DependencyProperty AccessIndirectPropertyProperty =
        DependencyProperty.RegisterAttached(
              "AccessIndirectProperty", typeof(bool), typeof(ControlSettings),
              new PropertyMetadata(false));

    public static bool GetAccessIndirectProperty(DependencyObject d)
    {
        return (bool) d.GetValue(AccessIndirectPropertyProperty);
    }
    public static void SetAccessIndirectProperty(DependencyObject d, bool value)
    {
        d.SetValue(AccessIndirectPropertyProperty, value);
    }
}

那么,

<local:MyControl x:Name="myControl" 
                 AccessDirectProperty="True" 
                 ControlSettings.AccessIndirectProperty="True" />

将设置一个可以通过以下方式访问的值

var p = ControlSettings.GetAccessIndirectProperty(myControl); // yields True

【讨论】:

    【解决方案2】:

    现在,在技术层面上,以下内容对于修改通过 MyControl.ControlSettings 提供的现有 MyControlSettings 实例的属性没有用处。但是,如果您的用例允许创建一个全新的 MyControlSettings 实例并将其分配给 MyControl.ControlSettings,则可以在 XAML 中执行此操作:

    <local:MyControl>
        <ControlSettings>
            <local:MyControlSettings AccessIndirectProperty="true" />
        </ControlSettings>
    </local:MyControl>
    

    附注:术语“ControlSettings”向我建议您希望在某种 MyControlSettings“容器”中“打包”控件设置/属性.现在,我不知道为什么以及这样做的动机是什么,但请记住,选择这种方法可能会使以有意义的方式使用数据绑定变得非常困难甚至不可能,而这种设置属性应该是绑定目标。如果您希望能够使用单个设置作为绑定目标(例如 AccessIndirectProperty="{Binding Path=Source}"),我宁愿建议您的 MyControl 将这些设置单独公开为 DependencyProperties。

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多