DataForm中的ComboBox IsEnabled绑定不起作用



我在一个DataForm中有几个组合框,我正在尝试使用它,以便在选择特定的组合框之前禁用某些组合框。为此,我在绑定到DataContext的类中创建了一个名为CanEditCombo的通知属性,并将我的ComboBoxes配置为:

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

CanEditCombo最初为false,但当DataForm第一次加载时,我的组合框是可编辑的。

如果我将相同的IsEnabled绑定语法应用于DataForm中的TextBox,它会按预期工作:一开始是禁用的,但一旦CanEditCombo变为true,它就会启用。

以下是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>

更重要的是,即使我在ComboBox上方的标记中将ComboBox的IsEnabled属性硬编码为False,它仍然是可编辑的。

当ComboBox在DataForm中时,如何通过绑定语法设置ComboBox的IsEnable属性?

不确定您是否已经找到了答案,但实际上有一个非常简单的解决方案:在DataField而不是ComboBox(或任何其他DataField嵌套控件)上设置IsEnabled。

<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属性从未在嵌套控件上访问过。

下面是我可以制作的最简单的模型,以表明它应该可以工作。复选框非常愉快地切换组合框的启用状态。

请寻找任何可能解释您的不工作的差异(或发布更多代码和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;
    }
}

相关内容

  • 没有找到相关文章

最新更新