簡體   English   中英

如何將IsEnabled或IsVisible屬性綁定到方法或屬性get?

[英]How to bind IsEnabled or IsVisible property to a method or property get?

我有一些控件需要根據某些計算結果隱藏或禁用。 我想將IsEnabled或IsVisible屬性綁定到父表單類的某些方法或屬性get的結果。 像這樣:

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding MyMethod}">
    <!--Some other stuff-->
</TabItem>

並在后面的代碼中:

public bool MyMethod()
{
    return _valueA + _valueB == 2;
}

您能幫我找到實現這一目標的適當方法嗎?

Thx,吉克拉

您可能需要使用MultiBinding

<TabItem Name="MyTab" Header="This should be enabled when result is 2">
  <TabItem.IsEnabled>
     <MultiBinding Converter={StaticResource MyAddConverter}>
         <Binding Path=ValueA UpdateSourceTrigger=PropertyChanged />
         <Binding Path=ValueB UpdateSourceTrigger=PropertyChanged />
     </MultiBinding>
  </TabItem.IsEnabled>
    <!--Some other stuff-->
</TabItem>

在ViewModel中,您應該具有以下內容(假設ViewModel實現INotifyPropertyChanged ):

public double ValueA
{
  get { return _valueA; }
  set 
  {
    _valueA = value;
    OnPropertyChanged("ValueA");
  }
}

ValueB相同,這將允許WPF在每次ValueAValueB更改時更新Binding

您的轉換器應如下所示:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
  double valueA = (double)values[0];
  double valueB = (double)values[1];
  return valueA + valueB == 2;
}

這將允許您在Converter中定義一個外部方法,每次ValueA或ValueB更改時都會再次調用該方法。

我會說這就是您所需要的=)

您需要創建一個新屬性,該屬性表示您要在此處嘗試實現的值。 這是視圖模型的全部目的。 我強烈建議您避免在此處使用轉換器,即使它可以工作。 應該使用轉換器來處理僅視圖問題,而這是視圖狀態問題。

潛在的視圖模型如下所示:(我正在使用BindableBase

class AddingViewModel : BindableBase {
    private int _valueA;
    public int ValueA {
        get { return _valueA; }
        set { SetProperty(ref _valueA, value, "ValueA", OnValueAChanged); }
    }

    private void OnValueAChanged() { UpdateIsTabEnabled(); }

    private int _valueB;
    public int ValueB {
        get { return _valueB; }
        set { SetProperty(ref _valueB, value, "ValueB", OnValueBChanged); }
    }

    private void OnValueBChanged() { UpdateIsTabEnabled(); }

    private bool _isTabeEnabled;
    public bool IsTabEnabled {
        get { return _isTabEnabled; }
        private set { SetProperty(ref _isTabEnabled, value, "IsTabEnabled"); }
    }

    private void UpdateIsTabEnabled() {
        IsTabEnabled = _valueA + _valueB == 2;
    }
}

這似乎有些冗長,但我想強調一些原因:

  • 隨着需求的變化,很容易找到並更改UpdateIsTabsEnabled
  • 由於ValueAValueB成為其他功能的組成部分,因此很容易在它們受人尊敬的OnChanged方法中添加掛鈎。
  • 根據需要將IsTabEnabled綁定到IsEnabledVisibility很容易。

您不能直接綁定到方法。 它必須是一個屬性。 話雖如此,還有其他一些技巧可以綁定到此問題中所示的方法上。在WPF中綁定到方法上嗎?

回到您的問題,我要做的是將MyMethod設置為屬性。

public double SumAB
{
    get{ return _valueA + _valueB;}
}

然后為您的綁定添加一個轉換器:

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding SumAB, Converter={StaticResource SumValueToBoolConverter}}">

您的轉換器代碼如下所示:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    double sumValue = (double)value;
    if(sumValue==2)
    {
        return true;
    }
    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM