我有一些控件需要根据某些计算结果隐藏或禁用。 我想将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,JiKra
答案 0 :(得分:3)
您可能需要使用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
,每当Binding
或ValueA
更改时,WPF都会更新ValueB
您的转换器应如下所示:
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更改时都会再次调用该方法。
我会说你需要的只是=)
答案 1 :(得分:2)
您需要创建一个新属性,表示您要在此处尝试实现的值。这是视图模型的全部目的。我强烈建议你不要在这里使用转换器,即使它可以工作。转换器应该用于处理仅查看问题,而这是一个视图状态问题。
潜在的视图模型如下所示:(我正在使用我的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
。ValueA
和ValueB
成为其他功能的组件时,可以轻松地将钩子添加到他们受尊敬的OnChanged
方法中。IsTabEnabled
绑定到IsEnabled
或Visibility
很容易。答案 2 :(得分:1)
您无法直接绑定到方法。它需要是一个财产。有了这个说法,还有一些其他技巧可以绑定到这个问题Bind to a method in 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;
}