Combobox: DataTemplate для каждого DataTrigger - PullRequest
0 голосов
/ 24 апреля 2019

У меня две проблемы, одна маленькая и одна большая, и мне нужна помощь;

Во-первых, это мой код:

                <ComboBox Name="cmb1" Width="165" Height="25" Margin="25,5,10,10" 
                      ItemsSource="{Binding ChoicesList}"
                      SelectedItem="{Binding SelectedChoiceList}">
            </ComboBox>
            <ComboBox Name="cmb2" Width="165" Height="25" Margin="10,5,25,10">
                <ComboBox.Style>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Sections}"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding SelectedChoiceList}" Value="Contract">
                                <Setter Property="ItemsSource" Value="{Binding Contract}"></Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding SelectedChoiceList}" Value="Service">
                                <Setter Property="ItemsSource" Value="{Binding Services}"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ComboBox.Style>
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="auto" />
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" 
                                           Text="{Binding Name}" 
                                           Margin="4,0"/>
                            <TextBlock Grid.Column="0" 
                                           Text="{Binding label}" 
                                           Margin="0"/>
                            <TextBlock Grid.Column="0" 
                                           Text="{Binding Start, StringFormat=d}"
                                           Margin="0"/>
                            <TextBlock Grid.Column="1" 
                                           Text="{Binding End,StringFormat=d}"
                                           Margin="0"/>
                        </Grid>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

Еще один день, другая проблема!

  1. В cmb2 я не хотел бы загружать ничего, пока не сделаю один из трех вариантов, есть ли способ? (на данный момент я загружаю список «раздел», если ничего не выбрано, и привязка меняется в соответствии с выбором. Я сделал этот выбор, потому что значение «раздел» может измениться, это может быть «A» или «B» или « C "и более, поэтому я хотел бы, чтобы" service "= список услуг," contract "= список контрактов и" section "= все остальные значения)

  2. Что еще более важно, я хотел бы переработать этот код, потому что в настоящее время DataTemplate одинаков для всех трех привязок, что не было неудобным (если я выберу «section», в текстовом блоке будет отображено «имя», потому что раздел имеет без метки, например), но я бы хотел, чтобы в контрактах отображалось «имя» + «от» + «дата начала» + «до» + «дата окончания».

Если я добавлю текстовый блок «text = from» и «text = to», он будет применяться ко всем моим выборам, и я получу, например, если я выберу «section», результат будет похож на «nameOfSection + from +» к ", и я не хочу этого.

Итак, я хотел бы, чтобы текстовое поле «от» и «до» появлялось только для выбора «контракт», я не знаю, возможно ли это?

Надеясь быть ясным и поблагодарив вас за то, что вы нашли время за помощь, которую вы мне окажете;

1 Ответ

1 голос
/ 24 апреля 2019

Добро пожаловать в ТАК!

Чтобы ответить на ваш первый пункт, убрав строку, которая устанавливает ItemSource, у вас не должно быть ничего загруженного

<Setter Property="ItemsSource" Value="{Binding Sections}"></Setter> можно удалить и заменить другим DataTrigger.

Чтобы ответить на второй вопрос, вы можете использовать DataTemplates со свойством DataType, чтобы применить стиль к определенному типу данных. Это означает, что вы можете настроить каждый из ваших, Сервисов, Разделов и Контрактов, чтобы они выглядели по-разному / шаблонировали свои собственные свойства.

<DataTemplate DataType="{x:Type classes:Contract}">
    <Label Content="Contract"/>
</DataTemplate>
<DataTemplate DataType="{x:Type classes:Service}">
    <Label Content="Service"/>
</DataTemplate>
<DataTemplate DataType="{x:Type classes:Section}">
    <Label Content="Section"/>
</DataTemplate>

Этот фрагмент кода демонстрирует это.

Вот также пример приложения, которое я сделал, которое должно делать то, что вы просили.

View

<Window x:Class="SOHelp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:classes="clr-namespace:SOHelp.Classes"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <DataTemplate DataType="{x:Type classes:Contract}">
            <Label Content="Contract"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type classes:Service}">
            <Label Content="Service"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type classes:Section}">
            <Label Content="Section"/>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <ComboBox Grid.Row="0" Width="165" Height="25" 
                  ItemsSource="{Binding ChoicesList}"
                  DisplayMemberPath="Name"
                  SelectedItem="{Binding SelectedChoiceList}"/>
        <ComboBox Grid.Row="1" Width="165" Height="25" 
                  ItemsSource="{Binding SelectedChoiceList.Items}"/>
    </Grid>
</Window>

Код позади / может быть ViewModel

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private ObservableCollection<Option> _choicesList;
    private Option _selectedChoiceList;
    public Option SelectedChoiceList
    {
        get { return _selectedChoiceList; }
        set { _selectedChoiceList = value; NotifyPropertyChanged(); }
    }
    public ObservableCollection<Option> ChoicesList
    {
        get { return _choicesList; }
        set { _choicesList = value; NotifyPropertyChanged(); }
    }
    public MainWindow()
    {
        InitializeComponent();

        ChoicesList = new ObservableCollection<Option>
        {
            new Option("Contract", new ObservableCollection<object>
            {
                new Contract(), new Contract(), new Contract()
            }),
            new Option("Service", new ObservableCollection<object>
            {
                new Service(), new Service(), new Service()
            }),
            new Option("Section", new ObservableCollection<object>
            {
                new Section(), new Section(), new Section()
            }),
        };

        DataContext = this;
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Классы, которые я создал

public class Option
{
    public string Name { get; set; }
    public ObservableCollection<object> Items { get; set; }
    public Option(string name, ObservableCollection<object> items)
    {
        Name = name;
        Items = items;
    }
}

public class Service
{
}

public class Section
{
}

public class Contract
{
}

Надеюсь, что это поможет. Дайте мне знать, если у вас есть какие-либо вопросы.

First combobox Example of second combobox Second example of second combobox Nothing loaded on startup

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