链接(依赖)属性到嵌套控件

时间:2013-06-18 14:07:17

标签: c# wpf xaml data-binding

我有一个ListBox,其中GroupStyle包含另一个ListBox。 现在我想根据父ListBox的组名过滤嵌套ListBox的Items。

在下面的代码中,我尝试将GroupItem.Name.Name属性链接到嵌套ListBox的ViewModel的GroupName属性,但这并没有很好用。

基本上,GroupNameIn属性由GroupItems的名称(TextBlock文本)填充,然后将GroupNameOut属性设置为PropertyChangedCallback中的相同值。但问题是GroupName绑定到的NestedItemsViewModel的{​​{1}}属性不会更新。

我的方法中是否存在一些错误,或者是否有更简单/更好的方法来实现此行为?

如果有人能指出我正确的方向,我将非常感激。

父ListBox的GroupStyle:

GroupNameOut

嵌套的ListBox:

<Style x:Key="MyListBoxGroupStyle" TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <StackPanel Name="container" Width="Auto" Orientation="Vertical">
                    <TextBlock Name="groupNameTextBlock" Text="{Binding Path=Name.Name}"/>

                    <ItemsPresenter/>

                    <MyNestedListBox  
                          DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=NestedItemsDataContext}"
                          ItemsSource="{Binding NestedItems}"
                          GroupNameIn="{Binding ElementName=groupNameTextBlock, Path=Text}"
                          GroupNameOut="{Binding Path=GroupName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ViewModel绑定到嵌套的ListBox:

public class MyNestedListBox : ListBox
{
    static MyNestedListBox()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyNestedListBox), new FrameworkPropertyMetadata(typeof(MyNestedListBox)));
    }

    public string GroupNameIn
    {
        get { return (string)GetValue(GroupNameInProperty); }
        set { SetValue(GroupNameInProperty, value); }
    }
    public string GroupNameOut
    {
        get { return (string)GetValue(GroupNameOutProperty); }
        set { SetValue(GroupNameOutProperty, value); }
    }

    // DepenencyProperties
    public static readonly DependencyProperty GroupNameInProperty =
        DependencyProperty.Register("GroupNameIn", typeof(string), typeof(MyNestedListBox), new UIPropertyMetadata(null) { PropertyChangedCallback = (obj, target) => 
            {
                obj.SetValue(GroupNameOutProperty, target.NewValue);
            } 
        });

    public static readonly DependencyProperty GroupNameOutProperty =
        DependencyProperty.Register("GroupNameOut", typeof(string), typeof(MyNestedListBox), new UIPropertyMetadata(null));
}

0 个答案:

没有答案