c# - 如何在此多绑定(bind)示例中设置源?

标签 c# wpf multibinding

我有两个这样的类:

public MyClass1: INotifyValueChanged
{
    public Dictionary<int, Color> Property1 
    { 
        public event PropertyChangedEventHandler PropertyChanged;

        get
        { 
             return this.property1
        }
        set
        {
             PropertyChanged.ChangeAndNotify(ref this.property1, value, () => Property1);
        }
    }
}

public MyClass2: INotifyValueChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public int Property2
    {   get
        { 
             return this.property2
        }
        set
        {
             PropertyChanged.ChangeAndNotify(ref this.property2, value, () => Property2);
        }
    }
}

ChangeAndNotify 是一种扩展方法,我使用它代替普通语法来通知属性已更改,因为这样我不需要将要更改的属性的名称键入为字符串,所以我认为它与问题无关。如果需要,我会发布它。

我想将 MyClass2.Property2 绑定(bind)到一个 Rectangle.Fill。

为此,我必须创建一个 IMultiValueConverter,它将在 Property1 的字典中查找 Property2 并返回它的颜色。

在我的 XAML 中,我为我的转换器类创建了一个条目:

<local:MaterialConverter x:Key="MaterialsConverter" />

然后我尝试多重绑定(bind)矩形:

<Rectangle>
    <Rectangle.Fill>
        <SolidColorBrush>
            <SolidColorBrush.Color>
                <MultiBinding Converter="{StaticResource MaterialsConverter}">
                    <Binding Path=Property1 />
                    <Binding Path=Property2 />
                </MultiBinding>
            </SolidColorBrush.Color>
        </SolidColorBrush>
     <Rectangle.Fill/>
</Rectangle>

在表单代码中,我有这两个类的两个变量:分别是 classObj1 和 classObj2。

初始化并设置它们后,我这样做是为了绑定(bind):

rectangle.DataContext = class1Obj;

当然它不起作用,因为它是一个多重绑定(bind),而且我在 DataContext 中只指定了 1 个元素,我得到一个错误,指出 Property2 在 MyClass1 上不存在。

我不认为我可以为一个对象设置 2 个 DataContext,但我可以以某种方式设置 XAML 中两个绑定(bind)之一的 Source 属性,因此一个绑定(bind)将来自矩形的 DataContext,另一个将来自另一个地方。但是我可以把 c​​lass2Obj 放在哪里或者怎么放?

最佳答案

这是一个应该对您有所帮助的示例。让我们从 2 个简单的类开始:

public class A
{
    public string Name { get; set; }
}

public class B
{
    public Dictionary<string, string> Dict { get; set; }
}

让我们按以下方式初始化 DataContext:

window.DataContext = new object[]
{
    new A{ Name = "Hello!" }, 
    new B
    { 
        Dict =new Dictionary<string, string> { "1", "a"}, {"2", "b"} 
    }
};

现在让我们创建一个转换器。我假设 values 数组中的第一个对象是 A 类型,第二个是 B 类型:

public class MultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var sb = new StringBuilder();
        sb.AppendLine(values[0].ToString());
        foreach (var kvp in (Dictionary<string, string>) values[1])
            sb.AppendLine(kvp.Key + "-" + kvp.Value);
        return sb.ToString();
    }
    //...
}

最后是 XAML:

<Window.Resources>
    <local:MultiConverter x:Key="converter"></local:MultiConverter>
</Window.Resources>
<TextBlock Name="textBox2">
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource converter}">
            <Binding Path="[0].Name"/>
            <Binding Path="[1].Dict"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

关于c# - 如何在此多绑定(bind)示例中设置源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28151112/

相关文章:

c# - 我下面的代码中可能存在路径遍历漏洞吗?

c# - 如何将 Wpf 项目迁移到新的 VS2017 格式

c# - 如何从代码隐藏发送多个击键

c# - WPF 多重绑定(bind) : OneWayToSource binding from TextBox updated via another binding doesnt work?

WPF,将 CSV 多重绑定(bind)到复选框列表框,以及 MVVM 最佳实践

c# - 在 Web 方法中访问 JSON 调用的参数

c# - 多线程访问.net中的集合

c# - 具有不同类型值的 OrderBy 列表

c# - 如何在应用程序启动时预加载 XAML?

c# - WPF 多重绑定(bind)失败。为什么?