4

DataFormにいくつかのComboBoxがあり、特定のComboBoxが選択されるまで特定のComboBoxが無効になるようにしようとしています。この目的のためCanEditComboに、DataContextにバインドされたクラスで名前が付けられた通知プロパティを作成し、ComboBoxを次のように構成しました。

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

これCanEditComboは最初はfalseですが、DataFormが最初にロードされたときにComboBoxを編集できます。

同じ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のIsEnabled上のマークアップでComboBoxのプロパティをFalseにハードコーディングしても、編集可能です。

IsEnableComboBoxがDataFormにある場合、バインディング構文を介してComboBoxのプロパティを設定するにはどうすればよいですか?

4

2 に答える 2

2

これに対する答えをまだ見つけたかどうかはわかりませんが、実際には本当に簡単な解決策があります。ComboBox(または他のDataFieldネストされたコントロール)ではなく、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プロパティにアクセスすることはありません。

于 2011-07-25T23:16:17.510 に答える
0

以下は、それが機能するはずであることを示すために、私が作成できる最も単純なモックアップです。チェックボックスは、コンボボックスの有効状態を非常にうまく切り替えます。

動作していない理由を説明する可能性のある違いを探してください(またはコードと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;
    }
}
于 2011-06-24T07:44:51.897 に答える