从 ItemsControl 获取一个元素并绑定到按钮



>我有一个 ItemsControl:

<ItemsControl x:Name="myList" ItemTemplateSelector="{DynamicResource mySelectorTemplate}" ItemsPanel="{StaticResource myPanelTemplate}"/>

我想拿其中一个项目,用他的逻辑做一个按钮:

<Button Style="{StaticResource myButtonStyle}"/>

myList 的一个项目有一个具有真值的布尔值。这是将用于制作按钮的项目:

Private myCollection As ObservableCollection(Of Items.Subitems)
myList.ItemsSource = myCollection

当 myCollection.myBooolean = true 时,是给予项目此特殊处理的字段。

什么是

有效的方法呢?

这有很多可能性 - 但这似乎是最好的方法。

您想使用DataTemplateSelector .你可以通过自己的overwritten逻辑选择n DataTemplate s。

C#

示例类:

public class MySampleClass
{
        public string Name;
        public bool MyFlag;
}

示例模板选择器

    public class MyTemplateSelector : DataTemplateSelector
    {
        public DataTemplate IsTrueTemplate
        {
            get;
            set;
        }
        public DataTemplate IsFalseTemplate
        {
            get;
            set;
        }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            MySampleClass temp = item as MySampleClass;
            if(temp != null)
            {
                if (temp.MyFlag)
                {
                    return IsTrueTemplate;
                }
                else
                {
                    return IsFalseTemplate;
                }
                // And so on
            }
            else
            {
                return base.SelectTemplate(item, container);
            }
        }
    }

在 XAML 中的用法

<ListBox>
    <ListBox.ItemTemplateSelector>
        <example:MyTemplateSelector>
            <example:MyTemplateSelector.IsTrueTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Button Style="{StaticResource myButtonStyle}" />
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
            </example:MyTemplateSelector.IsTrueTemplate>
            <example:MyTemplateSelector.IsFalseTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </example:MyTemplateSelector.IsFalseTemplate>
        </example:MyTemplateSelector>
    </ListBox.ItemTemplateSelector>
</ListBox>

example是 DataTemplateSelector-Namespace。我建议您 - 将DataTemplates存储在资源中并通过 StaticResource 进行设置。

最新更新