TextBox isEnabled 绑定依赖于组合框项目
TextBox isEnabled binding dependant on combobox item
所以我有一个绑定到项目列表的 ComboBox。 { A,B,C,D,E}
<ComboBox x:Name="cmbDMS" ItemsSource="{Binding Types}" SelectedValue="{Binding Type,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" SelectionChanged="cmbDMS_SelectionChanged" />
也是一个文本框。
<TextBox IsEnabled="{Binding isTypeB}" Grid.Row="6" Width="250" Margin="0,2" />
一旦 ComboBox SelectedValue 更改为 B,我不知道如何更新 TextBox isEnabled 属性。一旦我退出并返回到视图,它就可以工作,但我希望它是即时的。
谢谢。
如果您的 Binding 第一次起作用,后来又不起作用,那么您关于更改 属性 的通知可能不起作用。因此,请确保绑定到 DependencyProperty 的 属性 或在 setter 中引发 PropertyChanged 事件(INotifyPropertyChanged 接口的成员)。
我过去在绑定到 SelectedValue
时遇到过一些问题,并且它会正确引发事件。除非你有明确的理由,否则我喜欢绑定到 SelectedItem
我在这个操作中发现的问题是,绑定到 bool
对象不一定会通过更改 ComboBox
[= 的 SelectedItem
来更新20=]
如果您希望将两者关联起来,一个简单的方法是在 setter 中引发 bool isTypeB
属性 的 属性 changed 事件] 的 "Type"
属性:
(因为我不知道 "Type" 的类型,我假设它是一个字符串):
public string Type
{
get{...}
set
{
//...set logic
RaisePropertyChanged(); //will notify when "Type" changes
RaisePropertyChanged("isTypeB"); //will notify that isTypeB is changed
}
}
...
public bool isTypeB => Type == "TypeB";
RaisePropertyChanged
参考:
public event PropertyChangedEventHandler PropertyChanged;
public virtual void RaisePropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
我做了一个例子,让你理解。
由于它更像是基于视图的东西,我建议使用转换器并将代码包含在视图和转换器本身中。请参阅下面的代码。我测试了它,它在我这边运行良好。
当您 select B 文本框启用时,当 selection 更改为任何其他时,文本框被禁用。
XAML代码:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:viewModel="clr-namespace:WpfApplication1.ViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" >
<Window.Resources>
<viewModel:TestConverter x:Key="TestConverter" />
</Window.Resources>
<Grid Margin="329,0,0,0">
<ComboBox x:Name="cmbDMS" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" >
<ComboBoxItem Content="A"/>
<ComboBoxItem Content="B"/>
<ComboBoxItem Content="C"/>
<ComboBoxItem Content="D"/>
<ComboBoxItem Content="E"/>
</ComboBox>
<TextBox Grid.Row="6" Height="60" Width="250" Margin="0,2" IsEnabled="{Binding ElementName=cmbDMS, Path=Text, Converter={StaticResource TestConverter}}" />
</Grid>
</Window>
TestConverter.cs代码:
using System;
using System.Globalization;
using System.Windows.Data;
namespace WpfApplication1.ViewModel
{
public class TestConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
var si = value.ToString();
if (si.Equals("B"))
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
所以我有一个绑定到项目列表的 ComboBox。 { A,B,C,D,E}
<ComboBox x:Name="cmbDMS" ItemsSource="{Binding Types}" SelectedValue="{Binding Type,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" SelectionChanged="cmbDMS_SelectionChanged" />
也是一个文本框。
<TextBox IsEnabled="{Binding isTypeB}" Grid.Row="6" Width="250" Margin="0,2" />
一旦 ComboBox SelectedValue 更改为 B,我不知道如何更新 TextBox isEnabled 属性。一旦我退出并返回到视图,它就可以工作,但我希望它是即时的。
谢谢。
如果您的 Binding 第一次起作用,后来又不起作用,那么您关于更改 属性 的通知可能不起作用。因此,请确保绑定到 DependencyProperty 的 属性 或在 setter 中引发 PropertyChanged 事件(INotifyPropertyChanged 接口的成员)。
我过去在绑定到 SelectedValue
时遇到过一些问题,并且它会正确引发事件。除非你有明确的理由,否则我喜欢绑定到 SelectedItem
我在这个操作中发现的问题是,绑定到 bool
对象不一定会通过更改 ComboBox
[= 的 SelectedItem
来更新20=]
如果您希望将两者关联起来,一个简单的方法是在 setter 中引发 bool isTypeB
属性 的 属性 changed 事件] 的 "Type"
属性:
(因为我不知道 "Type" 的类型,我假设它是一个字符串):
public string Type
{
get{...}
set
{
//...set logic
RaisePropertyChanged(); //will notify when "Type" changes
RaisePropertyChanged("isTypeB"); //will notify that isTypeB is changed
}
}
...
public bool isTypeB => Type == "TypeB";
RaisePropertyChanged
参考:
public event PropertyChangedEventHandler PropertyChanged;
public virtual void RaisePropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
我做了一个例子,让你理解。 由于它更像是基于视图的东西,我建议使用转换器并将代码包含在视图和转换器本身中。请参阅下面的代码。我测试了它,它在我这边运行良好。
当您 select B 文本框启用时,当 selection 更改为任何其他时,文本框被禁用。
XAML代码:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:viewModel="clr-namespace:WpfApplication1.ViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" >
<Window.Resources>
<viewModel:TestConverter x:Key="TestConverter" />
</Window.Resources>
<Grid Margin="329,0,0,0">
<ComboBox x:Name="cmbDMS" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" >
<ComboBoxItem Content="A"/>
<ComboBoxItem Content="B"/>
<ComboBoxItem Content="C"/>
<ComboBoxItem Content="D"/>
<ComboBoxItem Content="E"/>
</ComboBox>
<TextBox Grid.Row="6" Height="60" Width="250" Margin="0,2" IsEnabled="{Binding ElementName=cmbDMS, Path=Text, Converter={StaticResource TestConverter}}" />
</Grid>
</Window>
TestConverter.cs代码:
using System;
using System.Globalization;
using System.Windows.Data;
namespace WpfApplication1.ViewModel
{
public class TestConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
var si = value.ToString();
if (si.Equals("B"))
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}