WPF 在 ComboBox 中绘制基元

WPF Draw primitives in ComboBox

我正在制作表示网络图的程序。我这里有许多用于两个节点之间连接的属性。实际上我正在尝试制作一个组合框,其中包含 MS Word 中的破折号类型。我的 ComboBox 代码:

<ComboBox ItemsSource="{Binding Dashes}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Canvas >
                <Line X1="0" Y1="0" X2="100" Y2="100" StrokeDashArray="{Binding Dash}"/>
            </Canvas>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

后面的代码:

private DoubleCollection _dash;
private List<DoubleCollection> _listOfDashes;

public DoubleCollection Dash
{
    get { return _dash; }
    set
    {
        _dash = value;
        OnPropertyChanged("Dash");
    }
}

public List<DoubleCollection> Dashes
{
    get { return _listOfDashes; }
    set
    {
        _listOfDashes = value;
        OnPropertyChanged("Dashes");
    }
}

启动程序后,ComboBox 不是空的(有两个可选对象),但项目是空的。我哪里出错了?

您正在将 ItemsSource 属性 绑定到您的 ViewModel Dashes 属性。这意味着每个 ItemTemplate 都可以绑定到 Dashes 集合的每个元素上(即 DoubleCollection)。

试试这样改变你的XAML:

<ComboBox ItemsSource="{Binding Dashes}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Line X1="0" Y1="0" X2="100" Y2="0" StrokeDashArray="{Binding}" Stroke="Black" Margin="6" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

这意味着每个 Line 都将其 StrokeDashArray 绑定到属于 Dashes 集合的每个 DoubleCollection。所以这样:

vm = new ViewModel();
vm.Dashes = new List<DoubleCollection>();
vm.Dashes.Add(new DoubleCollection());
vm.Dashes[0].Add(2);
vm.Dashes[0].Add(3);

vm.Dashes.Add(new DoubleCollection());
vm.Dashes[1].Add(1);
vm.Dashes[1].Add(4);

您会在 ComboBox 中看到两行不同的内容。希望对你有帮助。