Не работает привязка ComboBox IsEnabled в DataForm - PullRequest
4 голосов
/ 24 июня 2011

У меня есть несколько ComboBox в DataForm , и я пытаюсь сделать так, чтобы определенные ComboBox были отключены до тех пор, пока не будет выбран конкретный ComboBox. С этой целью я создал свойство уведомления с именем CanEditCombo в классе, который связан с DataContext, и настроил мои комбинированные списки следующим образом:

<ComboBox ... IsEnabled="{Binding CanEditCombo, Mode=OneWay}" />

Изначально CanEditCombo ложно, но мои комбинированные списки доступны для редактирования при первой загрузке DataForm.

Если я применяю тот же синтаксис привязки IsEnabled к TextBox в моей DataForm, он работает как положено: сначала отключается, но включается, когда CanEditCombo становится истинным.

Вот пример фрагмента XAML:

<toolkit:DataForm CurrentItem="{Binding NewProject, Mode=TwoWay}" x:Name="dfNewProject" CommandButtonsVisibility="None">
    <toolkit:DataForm.EditTemplate>
        <DataTemplate>
            <StackPanel>
                ...

                <toolkit:DataField>
                    <ComboBox ItemsSource="{Binding ProjectOptions, Mode=OneWay}"
                                SelectedValue="{Binding Options, Mode=TwoWay}"
                                DisplayMemberPath="Value"
                                SelectedValuePath="Key"
                                IsEnabled="{Binding CanEditCombo, Mode=OneWay}" />
                </toolkit:DataField>

                ...
            </StackPanel>
        </DataTemplate>
    </toolkit:DataForm.EditTemplate>
</toolkit:DataForm>

Более того, даже если я жестко закодирую свойство IsEnabled ComboBox в False в разметке над ComboBox, все еще можно редактировать.

Как мне настроить свойство IsEnable ComboBox с помощью синтаксиса привязки, когда ComboBox находится в DataForm?

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

Не уверен, что вы уже нашли ответ на этот вопрос, но на самом деле есть действительно простое решение: установите IsEnabled на DataField, а не на ComboBox (или любой другой вложенный элемент управления DataField).

<toolkit:DataField IsEnabled="{Binding CanEditCombo, Mode=OneWay}">
     <ComboBox ItemsSource="{Binding ProjectOptions, Mode=OneWay}"
               SelectedValue="{Binding Options, Mode=TwoWay}"
               DisplayMemberPath="Value"
               SelectedValuePath="Key" />
</toolkit:DataField>

Я не совсем уверен, что именно делает DataField, но свойство IsEnabled никогда не будет доступно для вложенного элемента управления.

0 голосов
/ 24 июня 2011

Вот самый простой макет, который я мог сделать, чтобы показать, что он должен работать.Флажок довольно счастливо переключает включенное состояние полей со списком.

Пожалуйста, обратите внимание на различия, которые могут объяснить, почему у вас не работает (или отправьте больше кода и XAML)

XAML:

<UserControl x:Class="ComboDemo.ComboEnabledTest"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <StackPanel x:Name="LayoutRoot" Background="White">
        <ComboBox IsEnabled="{Binding CanEdit, Mode=OneWay}" Height="23" Width="120" />
        <ComboBox IsEnabled="{Binding CanEdit, Mode=OneWay}" Height="23" Width="120" />
        <CheckBox IsChecked="{Binding CanEdit, Mode=TwoWay}" Content="Toggle CanEnable" Height="16" />
    </StackPanel>
</UserControl>

Код:

using System.Windows.Controls;

namespace ComboDemo
{
    public partial class ComboEnabledTest : UserControl
    {
        public ComboEnabledTest()
        {
            InitializeComponent();
            this.DataContext = new TestViewModel();
        }
    }
}

Просмотр модели:

using System.ComponentModel;

namespace ComboDemo
{
    public class TestViewModel : INotifyPropertyChanged
    {
        private bool _canEdit;
        public bool CanEdit
        {
            get { return _canEdit; }
            set
            {
                if (_canEdit != value)
                {
                    _canEdit = value;
                    if (this.PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("CanEdit"));
                    }
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
...