1

ボタンを有効にするためのテキストボックスを検証している状況があります。テキストボックスが空の場合、ボタンを無効にする必要があります。その逆も同様です。XAMLの背後にあるコードにロジックを記述すれば、コードを処理して解決策を実現で​​きますが、それは正しい方法ではなく、イベントはコードの背後ではなくviewModelから処理する必要があると感じています。

これが私がしたことです:
XAML

<TextBox Grid.Row="1" Margin="6,192,264,0" Height="60" VerticalAlignment="Top"
         x:Name="txtDNCNotes" Text="{Binding Path=DNCNotes, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
         TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" 
         Visibility="{Binding Path=DNCNoteTxtVisibility}" Grid.Column="1"
         behaviour:TextBoxFilters.IsBoundOnChange="True"
         TextChanged="TextBox_TextChanged" /> 


ViewModel

public string DNCNotes
{
    get { return _dncNotes; }
    set { 
        if (_dncNotes == value) return; 
        _dncNotes = value; 
        OnPropertyChanged("DNCNotes"); 
    }
}


背後にあるコード

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    var ctx = LayoutRoot.DataContext as NextLeadWizardViewModel;
    BindingExpression binding = txtDNCNotes.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    ctx.ShowDoNotContact();
}     

解決策を達成するためにviewModelに次のコードを書き込もうとしていますが、何を書くべきかわかりません。

public void ShowDoNotContact()
{
    Binding myBinding = new Binding("DNCNotes");

    //myBinding.Source =  DataContext as NextLeadWizardViewModel;

    myBinding.Source = txtDNCNotes;

    myBinding.Path = new PropertyPath("DNCNotes");
    myBinding.Mode = BindingMode.TwoWay;
    myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
    BindingOperations.SetBinding(txtDNCNotes, TextBox.TextProperty, myBinding);

    if (_dncNotes == null)
        OkCommand.IsEnabled = false;
    else
        OkCommand.IsEnabled = CanEnableOk();

}
4

2 に答える 2

3

TextBoxボタンを無効にするaを検証する場合はcommand、これに似たものを使用します。

    private ICommand showDCNoteCommand;
    public ICommand ShowDCNoteCommand
    {
        get
        {
            if (this.showDCNoteCommand == null)
            {
                this.showDCNoteCommand = new RelayCommand(this.DCNoteFormExecute, this.DCNoteFormCanExecute);
            }

            return this.showDCNoteCommand;
        }
    }

    private bool DCNoteFormCanExecute()
    {
        return !string.IsNullOrEmpty(DCNotes);

    }

    private void DCNoteFormExecute()
    {
        DCNoteMethod(); //This a method that changed the text
    }

DCNoteFormCanExecute()これにより、TextBoxは(DCNotesはViewmodel内で定義したプロパティです)に示されているnullまたは空の値を受け入れないため、ユーザーは続行したり、保存して進行したりできなくなります。

xamlで、そのようにボタンにバインドします。

<Button Content="Save" Grid.Column="1" Grid.Row="20" x:Name="btnSave" VerticalAlignment="Bottom" Width="75" Command="{Binding ShowDCNoteCommand}"

検証では、この参照を使用して、属性検証を使用して、このような単純なことを行うことができますusing System.ComponentModel.DataAnnotations

    [Required(ErrorMessage = "DCNotes is required")]
    [RegularExpression(@"^[a-zA-Z''-'\s]{1,5}$", ErrorMessage = "DCNotes must contain no more then 5 characters")] //You can change the length of the property to meet the DCNotes needs
    public string DCNotes
    {
        get { return _DCNotes; }
        set
        {
            if (_DCNotes == value)
                return;

            _DCNotes = value;
            OnPropertyChanged("DCNotes");
        }
    }

xaml内でResource、ボックスを強調表示して、テキストボックスが入力されていないことをユーザーに通知するを作成できます。

  <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Margin"
                Value="4" />
    </Style>

    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Margin"
                Value="4" />
        <Style.Triggers>
            <Trigger Property="Validation.HasError"
                     Value="true">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>

            </Trigger>
        </Style.Triggers>
    </Style>

これがお役に立てば幸いです。そうでない場合は、次のリンクが役立つ可能性があります。 http://www.codeproject.com/Articles/97564/Attributes-based-Validation-in-a-WPF-MVVM-Applicat

また

http://www.codearsenal.net/2012/06/wpf-textbox-validation-idataerrorinfo.html#.UOv01G_Za0t

于 2013-01-08T10:29:31.657 に答える
1

ViewModelは、モデルに影響を与えないビューのサポートプロパティを追加するための許容可能な場所です。たとえば、次のようなものです。

    public bool DncCanExecute
    {
        get
        {
           return "" != _dncNotes;
        }
    }

    public string DNCNotes
    {
        get { return _dncNotes; }
        set { 
            if (_dncNotes == value) return;
            if (("" == _dncNotes && "" != value) || ("" != _dncNotes && "" == value))
            {
                _dncNotes = value;
                OnPropertyChanged("DncCanExecute");
            }
            else
            {
                _dncNotes = value;
            }
            OnPropertyChanged("DNCNotes");
        }
    }

そこから、Button.IsEnabledプロパティをプロパティにバインドするだけでDncCanExecute、目的の機能を取得できます。

于 2013-01-07T17:44:07.307 に答える