代码之家  ›  专栏  ›  技术社区  ›  Capis

Mahapps WPF-组合框绑定的奇怪行为

  •  2
  • Capis  · 技术社区  · 7 年前

    当我在组合框中添加图标时,我有一种奇怪的行为。ItemTemplate。

    You can see the problem here (imgur) enter image description here

    我对WPF/C没有经验,我绑定项目或组合框的方式是否有问题。ItemTemplate?

    XAML代码

        <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Height="32" Margin="60,47,0,0" VerticalAlignment="Top" Width="282" ItemsSource="{Binding OtherTasks}" >
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <DockPanel Margin="0" Height="30">
                        <ContentControl Content="{Binding Path=Icono}" Margin="0,4,0,0" Background="Yellow" Width="16" Height="16" Visibility="Visible"/>
                        <AccessText HorizontalAlignment="Stretch" Margin="3,4,0,0" Text="{Binding Path=Text}" TextAlignment="Left" Width="Auto" />
                    </DockPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    

    CS代码

    namespace test___icon {
        public partial class MainWindow : MetroWindow {
    
            public class CLASS_OTHERTASKS {
                public string Text { get; set; }
                public object Icono { get; set; }
            }
    
            public List<CLASS_OTHERTASKS> OtherTasks { get; set; }
    
            public MainWindow() {
                OtherTasks = new List<CLASS_OTHERTASKS>();
                OtherTasks.Add(new CLASS_OTHERTASKS() { Text = "Test Air", Icono = new PackIconEntypo() { Kind = PackIconEntypoKind.Air } });
                OtherTasks.Add(new CLASS_OTHERTASKS() { Text = "Test Account", Icono = new PackIconMaterial() { Kind = PackIconMaterialKind.Account } });
                OtherTasks.Add(new CLASS_OTHERTASKS() { Text = "Test AxisThree", Icono = new PackIconModern() { Kind = PackIconModernKind.AxisThree } });
    
                InitializeComponent();
                this.DataContext = this;
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   mm8    7 年前

    控件只能出现 一旦 在可视化树中,从数据绑定属性返回控件不是一个好主意。您最好在XAML标记中定义视觉控件。类似这样:

    <ComboBox x:Name="comboBox" ItemsSource="{Binding OtherTasks}" >
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <DockPanel Margin="0" Height="30">
                    <ContentControl x:Shared="False" Content="{Binding}" Margin="0,4,0,0" Background="Yellow" Width="16" Height="16" Visibility="Visible">
                        <ContentControl.Style>
                            <Style TargetType="ContentControl">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Text}" Value="Test Air">
                                        <Setter Property="ContentTemplate">
                                            <Setter.Value>
                                                <DataTemplate>
                                                    <iconPacks:PackIconEntypo Kind="Air" />
                                                </DataTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Text}" Value="Test Account">
                                        <Setter Property="ContentTemplate">
                                            <Setter.Value>
                                                <DataTemplate>
                                                    <iconPacks:PackIconMaterial Kind="Account" />
                                                </DataTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Text}" Value="Test AxisThree">
                                        <Setter Property="ContentTemplate">
                                            <Setter.Value>
                                                <DataTemplate>
                                                    <iconPacks:PackIconModern Kind="AxisThree" />
                                                </DataTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                    <AccessText HorizontalAlignment="Stretch" Margin="3,4,0,0" Text="{Binding Path=Text}" TextAlignment="Left" Width="Auto" />
                </DockPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>