2

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

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

本质上,GroupNameIn属性由 GroupItems 的名称(TextBlock 文本)填充,然后将GroupNameOut属性设置为PropertyChangedCallback. 但问题是绑定到的属性GroupName不会更新。NestedItemsViewModelGroupNameOut

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

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

父 ListBox 的 GroupStyle:

<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>

嵌套列表框:

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));
}

ViewModel 绑定到嵌套的 ListBox:

public class NestedItemsViewModel : ViewModelBase
{
    private string _groupName;

    public ObservableCollection<NestedItem> NestedItems { get; set; }
    public string GroupName 
    {
        get 
        {
            return _groupName;
        }
        set
        {
            _groupName = value;
            OnPropertyChanged(() => GroupName);
        }
    }

    public NestedItemsViewModel()
    {
        NestedItems = new ObservableCollection<NestedItem>();
    }
}
4

0 回答 0