Member 12069642 Ответов: 1

Как включить и отключить кнопку в выпадающем списке шаблон данных DataTemplate


Привет,
Я борюсь с одной проблемой. Я хочу, чтобы кнопка включала, кто установлен сверху.
И остальные кнопки я хочу, чтобы отключить и кнопку внутри DataTemplate и что
Шаблон данных внутри ComboBox.
мой код :
<StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Left" Orientation="Horizontal" Name="interuptStackPanel">
	<Separator Width="20"  Style="{DynamicResource VerticalSeparatorStyle}" HorizontalAlignment="Right" />

	<ComboBox x:Name="cmbInterruptButtonCombo"

              HorizontalContentAlignment="Left"

			  Visibility="Collapsed"

			  VerticalContentAlignment="Center"

			  IsEditable="True"

			  Height="35" Width="150"

			  FontSize="15" FontWeight="SemiBold"

			  SelectionChanged="cmbInterruptButtonCombo_SelectionChanged">
		<combobox.itemcontainerstyle>
			<Setter Property="Height" Value="38" />
			<Setter Property="Width" Value="140" />
			<combobox.itemtemplate>
				<datatemplate>
 <DataTemplate>
                                <Button Content = "{Binding FieldName}" Uid="{Binding FieldID}" Height = "36" Width = "130" Click = "multipleInterupt_Click" IsEnabled="False"/>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
i tried so many codes but all are worth less. Please Provide me solution. 
Assume that there are more than 1 button and i want to make top button enable and rest disable.
<pre lang="c#">btnFieldID++;
setItemSourceForInterruptButton.Add(new PetGalaxy_BOL.Model.InteruptModelClass.InterruptCombo
{
	FieldID = btnFieldID,
	FieldName = TbcontentName.Text
});

cmbInterruptButtonCombo.ItemsSource = setItemSourceForInterruptButton.OrderByDescending(sc => sc.FieldID);
cmbInterruptButtonCombo.Items.Refresh();


Что я уже пробовал:

Вот ДТ не возвращается кнопки
cmbInterruptButtonCombo.SelectedValue = 0;
DataTemplate dt = cmbInterruptButtonCombo.ItemTemplate;

Graeme_Grant

У вас есть скриншот того, чего вы пытаетесь достичь?

Кроме того, это кодовый или MVVM-проект?

Member 12069642

- Да, видел. Но как тут вставить. я пытался вставить, но не могу

Graeme_Grant

Ваш неполный код очень неясен для того, чего вы пытаетесь достичь... Есть ли у каждого элемента кнопка или кнопка предназначена для самого combobox? Вставьте ссылку на изображение.

Member 12069642

https://ibb.co/ihhaGv

Member 12069642

И это только код позади я не использую шаблон MVVM

Member 12069642

https://ibb.co/ihhaGv

Graeme_Grant

Это не кнопки, а просто стилизованные ComboBoxItems.

Member 12069642

Это кнопки внутри элемента ComboBox см. код выше

Graeme_Grant

Тебе не нужны пуговицы. Посмотрите на ссылку решения ниже.

Member 12069642

& lt;combobox. itemtemplate>
<datatemplate>


Member 12069642

Почему мой полный код не приходит, я не знаю, но после datatemplate у меня есть кнопка .

Graeme_Grant

Обновите вопрос, не публикуйте его в качестве ответа. Но вы зря теряете время. Перейдите по ссылке, приведенной ниже-полностью рабочее решение.

Member 12069642

Я обновил свой вопрос, пожалуйста, посмотрите.

Graeme_Grant

Я дал вам рабочее решение. Остальное зависит от вас.

Member 12069642

Но это не решение . Просто попробуйте мой сценарий, а затем используйте свое рабочее решение.
Я надеюсь, что оба работают по-разному

Member 12069642

И u post условие в данной ссылке в классе конвертера, что значение == "коллекция".Но я не знаю его ценности .

Graeme_Grant

Вместо того чтобы пытаться работать с чужим кодом, я обновил свое решение адаптированной версией MVVM. Код выложен так, как он собран - от данных до пользовательского интерфейса.

1 Ответов

Рейтинг:
0

Graeme_Grant

Вот решение для вас: Windows отключает ComboBoxItem в WPF ComboBox Control с помощью примера конвертера в C# для Visual Studio 2010[^]

ОБНОВЛЕНИЕ: Обычно я делаю только MVVM, поэтому вот адаптация, которая позволит вам выборочно отключать отдельные элементы. Все, что вам нужно сделать, это стилизовать предметы.

1. База уведомлений, так что код изменен на пункт с поддержкой государства будут отражаться в пользовательском интерфейсе:

public abstract class ObservableBase : INotifyPropertyChanged
{
    public void Set<TValue>(ref TValue field, TValue newValue,
                            [CallerMemberName] string propertyName = "")
    {
        if (EqualityComparer<TValue>.Default
                                    .Equals(field, default(TValue))
                                         || !field.Equals(newValue))
        {
            field = newValue;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

2. Далее нам нужен класс, чтобы содержать значение ComboBoxItem и значение государственного:
public class Widget : ObservableBase
{
    private bool isEnabled = true;
    public bool IsEnabled
    {
        get => isEnabled;
        set => Set(ref isEnabled, value);
    }

    private string text;
    public string Text
    {
        get => text;
        set => Set(ref text, value);
    }
}

3. Теперь подключите код-за:
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        InitData();
        DataContext = this;
    }

    private void InitData()
    {
        Items = new ObservableCollection<Widget>
        {
            new Widget{ Text="Widget1" },
            new Widget{ Text="Widget2", IsEnabled = false },
            new Widget{ Text="Widget3", IsEnabled = false },
            new Widget{ Text="Widget4", IsEnabled = false },
            new Widget{ Text="Widget5" }
        };
    }

    public ObservableCollection<Widget> Items { get; set; }

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Debugger.Break();
    }
}

4. Теперь мы можем сделать пользовательский интерфейс:
<Window.Resources>
    <Style x:Key="ComboBoxItemStyle1" TargetType="{x:Type ComboBoxItem}">
        <Setter Property="IsEnabled" Value="{Binding IsEnabled, FallbackValue=true}"/>
    </Style>
</Window.Resources>

<Grid>
    <ComboBox ItemsSource="{Binding Items}"

                DisplayMemberPath="Text"

                ItemContainerStyle="{DynamicResource ComboBoxItemStyle1}"

                SelectionChanged="ComboBox_SelectionChanged"

                HorizontalAlignment="Center"

                VerticalAlignment="Center"

                Width="200"/>
</Grid>