如何知道UserControl中的哪个元素改变了属性?

时间:2016-06-22 15:54:09

标签: c# wpf user-controls

UserControl包含一些带有“State”属性的CustomControl

<UserControl x:Class="MyNamespace.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         mc:Ignorable="d" 
         d:DesignHeight="133" d:DesignWidth="175"
         x:Name="my_user_control">    
<Canvas>
    <c:Led State="{Binding SegmentState, Mode=TwoWay}"/>
    <c:Led State="{Binding SegmentState, Mode=TwoWay}"/>
    <c:Led State="{Binding SegmentState, Mode=TwoWay}"/>
</Canvas>

SegmentState是具有PropertyChangedCallback

的依赖项属性
public static DependencyProperty SegmentStateProperty =
      DependencyProperty.Register("SegmentState", typeof(bool), typeof(MyUserControl),
      new FrameworkPropertyMetadata(false, new PropertyChangedCallback(SegmentStateChanged)));

但是在SegmentStateChanged中我无法找到Leds改变了哪个属性。有没有办法找出来?

1 个答案:

答案 0 :(得分:0)

如果SegmentState将是bool,您应该编写三个SegmentState属性并将每个c:Led控件的State属性绑定到另一个属性:< / p>

<c:Led State="{Binding Segment0State, Mode=TwoWay}"/>
<c:Led State="{Binding Segment1State, Mode=TwoWay}"/>
<c:Led State="{Binding Segment2State, Mode=TwoWay}"/>

如果段数没有修复,你可以编写一个简单的SegmentState类,它只有一个bool Value属性,有一个名为SegmentStates的实例集合,并绑定到该集合中的项目 - 但是您必须编写一些代码来响应Value属性中的更改。上面的方法涉及一点点copy'n'paste,但它是迄今为止最容易正常工作的方法。

<ItemsControl ItemsSource="{Binding SegmentStates}>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <c:Led State="{Binding Value, Mode=TwoWay}"/>
        <DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>