INotifyPropertyChanged和Button.IsEnabled

时间:2016-03-17 13:28:00

标签: c# wpf mvvm inotifypropertychanged

我有View及其ViewModel。在View中,我有一些Panels绑定到我的ViewModel中的一些属性;

例如,第一个属性是SomeObject。在该面板中,我有一些文本框,它们绑定到SomeObject类中的某些属性。 ViewModel和类中的所有绑定都实现INPC。

该面板中的文本框以SomeObject类的方式绑定到其属性:SomeObject.Property

在该视图中,我有一个“保存”按钮。每当在文本框中输入内容或在面板中更改内容时,我都需要更改按钮的IsEnabled属性。

我通过更改{Some}的setter中绑定到按钮的SomeObject属性,仅在我的viewmodel中为IsEnabled属性完成了它。但是,当我在SomeObject的属性中更改某些内容时,它不会在ViewModel中调用main SomeObject的setter,并且我无法从IsEnabled更改SomeObject属性类。

<controls:ExpandableSettingsPanel Header="REFUND" IsExpanded="{Binding RefundCustomerConfigurationEnabled, Mode=TwoWay}" ..>
    <StackPanel..>
        <CheckBox Content="Allowed within reversal period" IsChecked="{Binding RefundCustomerConfiguration.IsAllowedWithinReversalPeriod, Mode=TwoWay}"/>
        <TextBlock Style="{DynamicResource GrayTextBlockStyle}" Text="Minimal amount to be refunded"/>
        <WrapPanel>
            <TextBlock Text="€" .. />
            <controls:MementoTextBox Text="{Binding RefundCustomerConfiguration.MinimalAmountToBeRefunded, Mode=TwoWay, 
                NotifyOnValidationError=True, StringFormat=\{0:N2\}, 
                TargetNullValue='', 
                UpdateSourceTrigger=PropertyChanged, 
                ValidatesOnNotifyDataErrors=True, 
                ValidatesOnExceptions=True}"  ..>
                    <i:Interaction.Behaviors>
                        <behaviors:TextBoxInputRegExBehavior 
                            EmptyValue="0.00"
                            IgnoreSpace="True"
                            RegularExpression="^\d{1,2}(\.?\d{1,2})?$" 
                            MaxLength="6"
                            />
                    </i:Interaction.Behaviors>
            </controls:MementoTextBox>
        </WrapPanel>
        <TextBlock Style="{DynamicResource GrayTextBlockStyle}" Text="Minimal bank statement line age" ../>
        <controls:MementoTextBox Text="{Binding RefundCustomerConfiguration.MinimalBankStatementLineAge, 
            Mode=TwoWay,
            NotifyOnValidationError=True,
            ValidatesOnNotifyDataErrors=True,
            UpdateSourceTrigger=PropertyChanged,
            ValidatesOnExceptions=True }" ..>
            <i:Interaction.Behaviors>
                <behaviors:TextBoxInputRegExBehavior 
                        EmptyValue="0"
                        IgnoreSpace="True"
                        RegularExpression="^\d{1,3}$" 
                        MaxLength="3"
                        />
            </i:Interaction.Behaviors>
        </controls:MementoTextBox>
    </StackPanel>
</controls:ExpandableSettingsPanel>

这是我的XAML部分。

public RefundCustomerConfiguration RefundCustomerConfiguration
{
    get { return _refundCustomerConfiguration; }
    set
    {
        SetProperty(ref _refundCustomerConfiguration, value);
        OnPropertyChanged("RefundCustomerConfigurationEnabled");
    }
}

[Required(ErrorMessage = "This field is required")]
public bool IsAllowedWithinReversalPeriod
{
    get { return GetValue(() => IsAllowedWithinReversalPeriod); }
    set
    {
        SetPropertyValue(value);
    }
}

这是我的财产;首先 - 在ViewModel中。第二 - 在第一个属性类。

1 个答案:

答案 0 :(得分:0)

将按钮的可见性属性绑定到类中的Visibility方法,该方法实现了INotifyPropertyChanged接口,如下所示:

public Visibility btnVisible
{
   get
   {
      if(<your condition>)
         return Visibility.Visible;
      else
         return Visibility.Collapsed;
   }
}