绑定到UI时获取无效的绑定路径

时间:2017-11-18 14:52:10

标签: c# xaml uwp

我有一个视图模型,其中有一个名为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

1 个答案:

答案 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}" />