我担心我有一个愚蠢的问题,我似乎无法找到答案。
我正在尝试为代码实现过滤器:它有一个可以输入标签的文本框,以及标签和未标记的复选框。我希望如果文本框中包含任何文本,Untagged将被禁用。
我认为这很容易:
我的ViewModel:
private bool _untaggedEnabled = true;
public UntaggedEnabled {
get {
return _untaggedEnabled;
} set {
_untaggedEnabled = value;
OnPropertyChanged(nameof(UntaggedEnabled));
}
}
我的观点CodeBehind: (是的,我可以单独在xaml中执行此操作,但如果我擅长xaml,我就不会在这里!)
private void tagsList_TextChanged(object sender, TextChangedEventArgs e) {
_viewModel.UntaggedEnabled = !string.IsNullOrWhiteSpace(tagsList.Text);
}
我的观点:
<TextBox x:Name="tagsList" Text="{Binding TagsList}" />
<CheckBox Content="Untagged" IsEnabled="{Binding UntaggedEnabled}" IsChecked="{Binding Untagged} />
组件中有许多其他控件和绑定属性,所有这些属性都正常工作,除了IsEnabled
。
我可以在整个地方调试输出,并且所有内容都会相应地更新,但实际上IsEnabled属性没有任何内容。
我还将Mode=TwoWay
和UpdateSourceTrigger=PropertyChanged
添加到IsEnabled xaml,但无济于事。
我觉得这应该很容易。谁能看到我失踪的东西?
答案 0 :(得分:2)
这个ViewModel绑定没有问题(并摆脱视图代码隐藏)
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged( [CallerMemberName] string propertyName = null )
{
PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( propertyName ) );
}
protected bool Set<T>( ref T storage, T value, [CallerMemberName] string propertyName = null )
{
if ( Equals( storage, value ) ) return false;
storage = value;
OnPropertyChanged( propertyName );
return true;
}
string _tags;
bool _untagged;
public string Tags
{
get => _tags; set
{
if ( Set( ref _tags, value ) )
{
OnPropertyChanged( nameof( UntaggedEnabled ) );
}
}
}
public bool Untagged { get => _untagged; set => Set( ref _untagged, value ); }
public bool UntaggedEnabled => string.IsNullOrWhiteSpace( Tags );
}
查看:
<TextBox
Text="{Binding Tags,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<CheckBox
Content="Untagged"
IsChecked="{Binding Untagged, Mode=TwoWay}"
IsEnabled="{Binding UntaggedEnabled, Mode=OneWay}"/>
答案 1 :(得分:0)
如果文本框中包含任何文本,则会禁用未标记
这可以在视图中没有任何代码的情况下轻松实现:
<TextBox Text="{Binding TagsList, UpdateSourceTrigger=PropertyChanged}" />
<CheckBox Content="Untagged" IsEnabled="{Binding IsUntaggedEnabled}"/>
但是在ViewModel中有一些:
string _tagList;
public string TagList
{
get { return _tagList; }
set
{
_tagList = value;
OnPropertyChanged(); // [CallerMemberName]
OnPropertyChanged(nameof(IsUntaggedEnabled));
}
}
public bool IsUntaggedEnabled => TagList != "";