如何在这个多重绑定示例中设置源?

时间:2015-01-26 13:34:50

标签: c# wpf multibinding

我有2个这样的课程:

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绑定到Rectangle.Fill。

要做到这一点,我必须创建一个IMultiValueConverter,它将在Property1的Dictionary上查找Property2并返回它的颜色。

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

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

然后我尝试多重绑定Rectangle:

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

在表单代码中,我有2个类的2个变量:classObj1和classObj2。

在初始化和设置它们之后,我这样做绑定:

rectangle.DataContext = class1Obj;

当然它不起作用,因为它是一个多绑定,我在DataContext中只指定了一个元素,我得到一个错误,说明在MyClass1上不存在Property2。

我认为我不能将2个DataContexts设置为一个对象,但我可以以某种方式设置XAML中2个绑定之一的Source属性,因此一个绑定将来自矩形的DataContext,另一个绑定来自这个另一个地方。但是我可以在哪里放上class2Obj或者怎么做?

2 个答案:

答案 0 :(得分:1)

您可以使用Steven Rands的建议:

<SolidColorBrush.Color>
    <MultiBinding Converter="{StaticResource MaterialsConverter}">
        <Binding Path="Property1" Source="{StaticResource MyClass1}" />
        <Binding Path="Property2" Source="{StaticResource MyClass2}" />
    </MultiBinding>
</SolidColorBrush.Color>

或者您可以将第三个类用作Rectangle的DataContext

public class MyClass3 : INotifyPropertyChanged
{
    public MyClass1 Class1
    {
        get
        {
            /* your code... */
        }
        set
        {
            /* your code... */    
        }
    }

    public MyClass2 Class2
    {
        get
        {
            /* your code... */
        }
        set
        {
            /* your code... */
        }
    }
}

在这种情况下,您的绑定将变为:

<Binding Path="Class1.Property1" />
<Binding Path="Class2.Property2" />

答案 1 :(得分:1)

这是一个应该可以帮到你的例子。让我们从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>