如何在不使用扩展器的情况下将WPF工具栏绑定到VM中的集合

Ric*_*ner 5 data-binding wpf toolbar mvvm

我有一个WPF窗口ToolBar.我的VM中有一组对象,我正在绑定它.它们显示为按钮,但它们总是被推到扩展的下拉部分ToolBar.如何使这些按钮出现在标准部分ToolBar?

我有以下XAML:

<ToolBarTray Grid.Row="1">
    <ToolBar ItemsSource="{Binding Path=MyList}" >
        <ToolBar.ItemTemplate>
            <DataTemplate  >
                <Button ToolTip="{Binding ButtonName}" 
                        Command="{Binding Path=ButtonCommand}" >
                    <Button.Content>
                        <Image Width="32" Height="32" Source="{Binding ImageSource}"/>
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ToolBar.ItemTemplate>
    </ToolBar>
</ToolBarTray>
Run Code Online (Sandbox Code Playgroud)

我有以下C#:

public List<MyClass> MyList
    {
        get
        {
            return new List<MyClass>
                       {
                           new MyClass{ButtonName="Button1",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                           new MyClass{ButtonName="Button2",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                           new MyClass{ButtonName="Button3",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                           new MyClass{ButtonName="Button4",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                       };

        }
    }
Run Code Online (Sandbox Code Playgroud)

这是视觉效果:

替代文字

Edu*_*eni 4

工具栏中有一个错误,如果重新调整窗口大小,问题就会消失。

解决方案是使用另一个控件,例如:

public class WorkaroundToolBar : ToolBar
{
    private delegate void IvalidateMeasureJob();

    public override void OnApplyTemplate()
    {
        Dispatcher.BeginInvoke(new IvalidateMeasureJob(InvalidateMeasure), 
                                     DispatcherPriority.Background, null);
        base.OnApplyTemplate();
    }
}
Run Code Online (Sandbox Code Playgroud)

查看此线程以获取更多信息