【问题标题】:Binding Ellipse Fill property in ItemTemplate在 ItemTemplate 中绑定 Ellipse Fill 属性
【发布时间】:2018-05-16 17:28:33
【问题描述】:

当我添加此代码时,我正在尝试在 Combobox 中添加一个彩色椭圆:

<ComboBox Width="300" BorderBrush="#6593CF" Visibility="Visible" BorderThickness="1"  Margin="5" VerticalAlignment="Top" ItemsSource="{Binding Parts}" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="0">
                <Label Content="Code" Margin="0" Padding="0"/>
                <Label Content="{Binding reference}" Margin="0" Padding="0"></Label>
                <Label Content="  R " Margin="0" Padding="0"/>
                <Label Content="{Binding R}" Margin="0" Padding="0"></Label>

                <Ellipse Height="20" Width="20" Fill="Red" Margin="0"/>

            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

它可以工作并显示红色椭圆;但是当我像这样绑定 Ellipse 的 Fill 属性时:

<Ellipse Name="elli" Height="20" Width="20" Fill="{Binding color}" Margin="0"/>

并在 ViewModel 中添加颜色属性,它不起作用并在组合框中显示一个空白区域。

ViewModel 中的属性代码如下:

public string _color = "Red";
public string color
{
    get
    {
        return _color;
    }

    set
    {
        if (_color == value)
        {
            return;
        }
        _color = value;
        RaisePropertyChanged("color");
    }
}

我也尝试在 Datagrid 元素中添加 Ellipse,但我遇到了同样的问题。

【问题讨论】:

    标签: c# wpf xaml binding


    【解决方案1】:

    在 ItemTemplate 中,DataContext 是组合框项。这意味着{Binding color} 在组合框项上查找名为color 的属性。

    color 是您的主视图模型的属性,我收集。但是Parts 中的每个对象都使用该DataTemplate 显示。如果这些对象都没有一个名为color 的属性,那么您将绑定到任何内容。同样的原则也适用于 DataGrid 单元格模板。

    所以你需要找到主视图模型。如果你在一个窗口中,那可能是窗口的视图模型,它将是包含控件的 DataContext。所以试试这个组合框:

    Fill="{Binding DataContext.color, RelativeSource={RelativeSource AncestorType=ComboBox}}"
    

    如果您在 DataGrid 单元格模板中有一个组合框,您将需要 AncestorType=ComboBox -- 继续往上走,直到您确定您获得的控件具有正确的 DataContext。

    我同意 Erno 的观点,将颜色表示为字符串并不理想,但字符串会起作用。

    最好是让您的 viewmodel 属性成为一个专门的枚举类型,它表达了与用户交流的任何颜色的语义:Info/Warning/Error、OnTime/Early/Delayed——即之类的事情。然后使用值转换器或触发器将其转换为视图中的画笔。

    【讨论】:

    • 为了避免混淆是写AncestorType=Window还是AncestorType=Page,您可以始终只使用父ItemsControl的DataContext,即AncestorType=ComboBox
    • 非常感谢它的工作,并且解释非常好,但是现在我最终得到了一个充满相同颜色椭圆的列表,我想做的是使每个颜色对应于一个颜色零件 Object 的状态。 (例如 Red 表示有缺陷,Green 表示 OK 等),你能告诉我更多关于在这种情况下如何使用枚举类型和值转换器的信息吗? , 再次感谢您
    • @J.Doe 想想我在回答Parts 中的对象时所说的话:如果color 是这些对象的属性,那么您拥有的原始绑定将起作用。你能定义一个适合你需要的枚举类型,然后在Parts中包含的类中添加一个该类型的属性吗?请这样做并将该代码添加到您的问题中。然后我们可以通过值转换器部分。
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2011-03-04
    • 2015-06-11
    相关资源
    最近更新 更多