1

IDataErrorInfo インターフェイスを使用して検証を処理する ViewModel を取得しました。これは、ComboBoxes、TextBoxes、Checkboxes などでうまく機能します。

DatePicker は、「DateTime?」へのバインディングに基づいて入力自体を検証するようです。ViewModel 内のプロパティも正常に動作します。

ここで、ViewModel 内からコマンド バインディングを使用してボタンを無効/有効にしたいと考えています。いずれかのコントロールが検証エラーを示している場合、ボタンを無効にする必要があります。

MVVM-Light の RelayCommand を使用すると、 DatePickers 以外のすべてでこれが機能するようになりました。

Relayコマンドコード:

this.DoSomethingCommand = new RelayCommand(this.DoSomething, this.CanDoSomething);


Validation-State を ViewModel に取得する方法はありますか?
これについての助けに本当に感謝します!



誰かが言及する前に: 私は既に Multidatatrigger を使用しようとしたため、ビューで Button IsEnabled プロパティを処理しました。それは機能しませんでした.IsEnabledは、データトリガーを使用して変更できなかった唯一のプロパティでした. CommandBindings がなくても (私の会社の Authentication-Framework が原因かもしれません)

これが私が試したDataTriggerコードです:

    <Button x:Uid="Button_1"
            Content="DoSomething"
            IsDefault="True"
            Command="{Binding DoSomethingCommand}">

        <Button.Style>
            <Style x:Uid="Style_1"
                   TargetType="{x:Type Button}"
                   BasedOn="{StaticResource {x:Type Button}}">
                <Setter x:Uid="Setter_2"
                        Property="IsEnabled"
                        Value="false" />
                <Style.Triggers>
                    <MultiDataTrigger x:Uid="MultiDataTrigger_1">
                        <MultiDataTrigger.Conditions>
                            <Condition x:Uid="Condition_1"
                                       Binding="{Binding (Validation.HasError), ElementName=ComboBox1}"
                                       Value="false" />
                            <Condition x:Uid="Condition_2"
                                       Binding="{Binding (Validation.HasError), ElementName=ComboBox2"
                                       Value="false" />
                            <Condition x:Uid="Condition_3"
                                       Binding="{Binding (Validation.HasError), ElementName=ComboBox3}"
                                       Value="false" />
                            <Condition x:Uid="Condition_4"
                                       Binding="{Binding (Validation.HasError), ElementName=ComboBox4}"
                                       Value="false" />
                            <Condition x:Uid="Condition_5"
                                       Binding="{Binding (Validation.HasError), ElementName=ComboBox5}"
                                       Value="false" />
                            <Condition x:Uid="Condition_6"
                                       Binding="{Binding (Validation.HasError), ElementName=DatePicker1}"
                                       Value="false" />
                            <Condition x:Uid="Condition_7"
                                       Binding="{Binding (Validation.HasError), ElementName=DatePicker2}"
                                       Value="false" />
                        </MultiDataTrigger.Conditions>
                        <Setter x:Uid="Setter_1"
                                Property="IsEnabled"
                                Value="True" />
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
4

2 に答える 2

1

これを試してください: Xaml の場合:

  <Grid> 
    <Button IsDefault="True" Content="Login" Height="27" Width="75" CommandParameter="{Binding ElementName=XXXXXXXX}" Command="{Binding LoginCommand, Source={StaticResource LoginController}}" Grid.Column="1" Grid.Row="7"/>

    <Button Content="Cancel" Height="27" Width="75" Grid.Column="3" Grid.Row="7" IsCancel="True">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <i:InvokeCommandAction Command="{Binding CancelCommand,Source={StaticResource LoginController}}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
    <Label Foreground="White" Content="User Name:" Grid.Column="1" Grid.Row="1"/>
    <Label Foreground="White" Content="Password:" Grid.Column="1" Grid.Row="3"/>
    <TextBox x:Name="UserName" HorizontalAlignment="Left" Width="130" Height="27" Grid.Column="3" Grid.Row="1" Text="{Binding UserName, Source={StaticResource LoginController}, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>
    <PasswordBox HorizontalAlignment="Left" Width="130" Height="27" w:PasswordHelper.Attach="True" 
     w:PasswordHelper.Password="{Binding Password,Source={StaticResource LoginController}, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=true, NotifyOnValidationError=true}" Grid.Column="3" Grid.Row="3" />        
</Grid>

ViewModel で:

     public ICommand LoginCommand
    {
        get
        {
            return new RelayCommand(OnLogin, IsEnable);
        }
    }
 public void OnLogin(object param)
    {
        //code
    }
bool IsEnable(object obj)
    {
           //Code for you button enable for example "return false;"
    }

これがあなたを助けることを願っています。

于 2013-07-05T11:15:27.967 に答える
0

最終的解決:

次のコードで必要に応じて動作させました:

意見:

    <Button x:Uid="Button_1"
            Content="DoSomething"
            IsDefault="True"
            Command="{Binding DoSomethingCommand}">
        <Button.CommandParameter>
            <MultiBinding x:Uid="MultiBinding_1" Converter="{StaticResource validationConverter}">
                <Binding x:Uid="Binding_1" ElementName="ComboBox1"
                         Path="(Validation.HasError)" />
                <Binding x:Uid="Binding_2" ElementName="ComboBox2"
                         Path="(Validation.HasError)" />
                <Binding x:Uid="Binding_3" ElementName="ComboBox3"
                         Path="(Validation.HasError)" />
                <Binding x:Uid="Binding_4" ElementName="ComboBox4"
                         Path="(Validation.HasError)" />
                <Binding x:Uid="Binding_5" ElementName="ComboBox5"
                         Path="(Validation.HasError)" />
                <Binding x:Uid="Binding_6" ElementName="DatePicker1"
                         Path="(Validation.HasError)" />
                <Binding x:Uid="Binding_7" ElementName="DatePicker2"
                         Path="(Validation.HasError)" />
            </MultiBinding>
        </Button.CommandParameter>                
    </Button>

ValidationConverter:

public class ValidationConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        foreach (var item in values)
        {
            if ((bool)item == true)
            {
                return true;
            }
        }

        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        List<object> list = new List<object>();

        foreach (var item in targetTypes)
        {
            list.Add(Binding.DoNothing);
        }

        return list.ToArray();
    }
}

ViewModel の CanExecute メソッド:

private bool CanDoSomething(object obj)
{
    return !(bool)obj;
}
于 2013-07-09T13:32:01.793 に答える