简体   繁体   English

XAML:DependecyObject的属性在作为附加集合中的一项时不会更新

[英]XAML: Property on DependecyObject not updating when it is an item in an attached collection

I have a DependencyObject that's inside an attached dependency property (that's a collection). 我有一个DependencyObject,它位于附加的依赖项属性(这是一个集合)中。 Binding to that object does not work for some reason. 出于某种原因,绑定到该对象不起作用。

In my example, I am binding two things, a basic attached property ( local:CollHolder.BasicProperty ) and a regular dependent property ( local:MyItem.MyData ) - both are bound to the Text of a TextBox control. 在我的示例中,我绑定了两件事,一个基本的附加属性( local:CollHolder.BasicProperty )和一个常规的依赖属性( local:MyItem.MyData )-两者都绑定到TextBox控件的Text上。 The XAML looks like this: XAML看起来像这样:

<ListView ItemsSource="{x:Bind Items}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="x:String">
            <StackPanel x:Name="stack" local:CollHolder.BasicProperty="{Binding ElementName=text, Path=Text}" VerticalAlignment="Center" HorizontalAlignment="Center" >
                <TextBox Text="" x:Name="text"/>
                <local:CollHolder.Coll>
                    <local:MyItem MyData="{Binding ElementName=text, Path=Text}"/>
                </local:CollHolder.Coll>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

When changes happen the Text property, they propagate to the attached property, but not to the dependency property. 发生更改时, Text属性将传播到附加属性,而不传播到依赖项属性。

CollHolder: CollHolder:

public class CollHolder : DependencyObject
{
    public static readonly DependencyProperty BasicPropertyProperty =
        DependencyProperty.RegisterAttached("BasicProperty", typeof(string), typeof(CollHolder), new PropertyMetadata("", DPC));
    public static readonly DependencyProperty CollProperty =
        DependencyProperty.RegisterAttached("Coll", typeof(Coll), typeof(CollHolder), new PropertyMetadata(null));
    public static Coll GetColl(DependencyObject obj)
    {
        var coll = (Coll)obj.GetValue(CollProperty);
        if (coll == null)
        {
            obj.SetValue(CollProperty, coll = new Coll());
        }

        return coll;
    }

    public static void SetColl(DependencyObject obj, Coll value)
    {
        obj.SetValue(CollProperty, value);
    }


    public static string GetBasicProperty(DependencyObject obj)
    {
        return (string)obj.GetValue(BasicPropertyProperty);
    }

    public static void SetBasicProperty(DependencyObject obj, string value)
    {
        obj.SetValue(BasicPropertyProperty, value);
    }


    private static void DPC(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Debug.WriteLine("Basic Property changed");
    }
}

MyItem: MyItem:

public class MyItem : DependencyObject
{
    public string MyData
    {
        get { return (string)GetValue(MyDataProperty); }
        set { SetValue(MyDataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyData.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyDataProperty =
        DependencyProperty.Register("MyData", typeof(string), typeof(MyItem), new PropertyMetadata("", DPC));



    private static void DPC(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Debug.WriteLine("CHANGED!!");
    }
}

And the collection is pretty simple: 集合非常简单:

public class Coll : List<MyItem>
{
}

When changes happen the Text property, they propagate to the attached property, but not to the dependency property. 发生更改时,Text属性将传播到附加属性,而不传播到依赖项属性。

<TextBox Text="" x:Name="text"/>
<local:CollHolder.Coll>
  <local:MyItem MyData="{Binding ElementName=text, Path=Text}"/>
</local:CollHolder.Coll>

The TextBox and local:MyItem in the same DataContext , you could use {x:Bind } to get the text value directly. TextBoxlocal:MyItem在同一DataContext ,您可以使用{x:Bind }直接获取文本值。

<TextBox Text="{x:Bind }" x:Name="text" />
<local:CollHolder.Coll>
    <local:MyItem  MyData="{x:Bind }" />
</local:CollHolder.Coll>

Update 更新

I tried to replace MyItem with Control to test whether DependencyProperty works in Binding mode. 我试图用Control替换MyItem以测试DependencyProperty是否在Binding模式下工作。 It works as expected. 它按预期工作。 So, you could use Control as MyItem's base class. 因此,您可以将Control用作MyItem的基类。

public class MyItem : Control
 {
     public string MyData
     {
         get { return (string)GetValue(MyDataProperty); }
         set { SetValue(MyDataProperty, value); }
     }

     // Using a DependencyProperty as the backing store for MyData.  This enables animation, styling, binding, etc...
     public static readonly DependencyProperty MyDataProperty =
         DependencyProperty.Register("MyData", typeof(string), typeof(MyItem), new PropertyMetadata("", DPC));

     private static void DPC(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
         Debug.WriteLine("CHANGED!!");
     }
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM