我有一个视图模型,其中有一个名为FormItem的类。此类中有一个表单项属性,用于控制表单项类中的属性的可见性 此属性的类型为Visibility Provider,这是另一个类。我在下面给出了课堂定义。
public class FormItem : FormSchema, IDictionary<string, object>, INotifyPropertyChanged
{
public VisibilityStateProvider VisibilityProvider { get; set; }
public FormItem()
{
VisibilityProvider = new VisibilityStateProvider(this);
}
}
public class VisibilityStateProvider : IPropertyStateProvider
{
private FormItem FormItem;
public VisibilityStateProvider(FormItem formItem)
{
FormItem = formItem;
}
public bool this[string key]
{
get
{
return GetVisibilityValue(key);
}
}
private bool GetVisibilityValue(string key)
{
bool result=true;
try
{
returns true or false on basis of some computation
}
}
catch (Exception ex)
{
return false;
}
return result;
}
public void NotifyVisibilityChanged(string key)
{
var a= $"Item[{key}]";
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(a));
}
public event PropertyChangedEventHandler PropertyChanged;
}
现在,当我们尝试使用以下代码绑定UWP中的可见性提供程序时:
<TextBlock Text="Test" Visibility="{x:Bind ViewModel.FormItem.VisibiltyProvider[key],Convertor = {StaticResource BoolToVisibilityOCnvertor}}"/>
我们的绑定路径无效。现在,如果我们直接绑定到属性,我们将属性更改为null。我在以下问题中已经在StackOverflow上提出了问题: Binding through IDictionary<string,object> property changed event handler is null
答案 0 :(得分:0)
从你的代码片段看,看起来需要的是有一个可观察的词典,比如 -
public class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged
就绑定而言,如果您知道键值,则可以直接在绑定中使用它而不是&#34;键&#34;。例如,在您的情况下,如果必须基于字典显示TextBlock:{&#34; ShowTextBlock&#34; :true},那么你可以像这样绑定 -
<TextBlock Visibility="{Binding Dictionary[ShowTextBlock], Converter={StaticResource BoolToVisConverter}" />