wpf 在.Net Framework 4.x中声明类似于绑定中使用的属性的数组[重复]

gpnt7bae  于 2023-05-08  发布在  .NET
关注(0)|答案(1)|浏览(166)

此问题已在此处有答案

Bind to explicit interface indexer implementation(1个答案)
2天前关闭。
因为我需要在UI中显示大量的位信息,所以我试图有一个数据结构,可以根据单个位(每个int为32位)公开不同属性的数组。我想出的是一个有点笨拙,不工作的约束力。所以我想知道有没有更好的方法来实现这个目标。
我目前拥有的:我声明了几个不同的接口,每个接口都有一个[]运算符属性。

public interface IProperty1
{
    string this[int index] { get; }
}

主类不仅实现了这个接口,还公开了一个基于这个接口的属性,并显式地实现了每个接口,从而实现了索引运算符。

public class BitData: IProperty1, IProperty2, IProperty3
{
    public IProperty1 Property1 => this;
    public IProperty2 Property2 => this;
    public IProperty3 Property3 => this;
  
    string IPropert1.this[int index]
    {
        get { //logic here; }
    }
}

在单元测试中,如果我有一个BitData对象,我可以使用data.Property1[0](如Assert.AreEqual(xxxxx, data.Property1[i]).)这样的语法访问各个位的各个属性
然而,当我使用对象作为数据上下文和“属性[0]”作为绑定路径时,WPF会抱怨“[] property not found on object of type BitData”。

<DataTemplate DataType="{x:Type BitData }">
    <TextBlock Text="{Binding Path=Property1[0]}" Foreground="{Binding Path=Property2[0]}" Background="{Binding Path=Property3[0]}"/>
</DataTemplate>
pgvzfuti

pgvzfuti1#

在我的UI中,我还有一个整数值,表示打开或关闭的继电器数量。
在绑定中,我只使用整数值与这个IConverter

/// <summary>
/// returns true, if the bit designated by bitNumber (starting at 0 from the right) is set
/// </summary>
public class BitMaskToBooleanConverter : IValueConverter
{
    #region Implementation of IValueConverter
    public object Convert(object bittedValue, Type voidTargedType, object bitNumber, CultureInfo voidCulture)
    {
        if (bittedValue == null)
            return false;
        if (bitNumber == null)
            return false;

        var nValue = System.Convert.ToInt64(bittedValue);
        var nBit = System.Convert.ToByte(bitNumber);

        var maskedValue = nValue & (1 << nBit);

        return maskedValue != 0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Xaml中的用法如下所示

...
<UserControl.Resources>
    <ResourceDictionary>
        ...
        <converters:BitMaskToBooleanConverter x:Key="BitMaskToBooleanConverter" 
        ...
    <ResourceDictionary>
</UserControl.Resources>
...
<CheckBox "Relay 1" IsChecked="{Binding RelayInteger, ConverterParameter=0, Converter={StaticResource BitMaskToBooleanConverter}, UpdateSourceTrigger=PropertyChanged}" IsEnabled="False" /

相关问题