Свойство Binding Ellipse Fill в ItemTemplate - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь добавить цветной эллипс в комбинированный список, когда я добавляю этот код:

<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>

он работает и показывает красный эллипс;но когда я связываю свойство Fill эллипса следующим образом:

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

и добавляю свойство color в ViewModel, оно не работает и показывает пустое место в comboBox.

Вот код свойства в ViewModel:

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

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

Я также пытался добавить Ellipse внутри элемента Datagrid, и все же я получаю ту же проблему.

1 Ответ

0 голосов
/ 16 мая 2018

В ItemTemplate DataContext является элементом комбинированного списка. Это означает, что {Binding color} ищет свойство с именем color в элементе списка.

color является собственностью вашей основной модели представления, я так понимаю. Но каждый объект в Parts отображается с использованием этого DataTemplate. Если каждый из этих объектов не имеет свойства с именем color, вы ничего не привязываете. Тот же принцип применяется в шаблоне ячейки DataGrid.

Так что вам нужно найти основную модель представления. Если вы находитесь в Window, то это, вероятно, viewmodel Window, который будет DataContext содержащего элемента управления. Так что попробуйте это для выпадающего списка:

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

Если у вас есть комбинированный список в шаблоне ячейки DataGrid, вам понадобится AncestorType=ComboBox - продолжайте идти по цепочке, пока не убедитесь, что получаете элемент управления с правильным DataContext.

Я согласен с Эрно в том, что не обязательно выражать цвет в виде строки, но строка будет работать.

Лучше было бы сделать свойство viewmodel специализированным типом перечисления, который выражает семантику любого цвета, сообщаемого пользователю: Info / Warning / Error, OnTime / Early / Delayed - такого рода вещи. А затем преобразовать это в кисть в представлении с помощью преобразователя значений или триггеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...