如何在此多绑定示例中设置源?
How to set the sources in this multibinding example?
我有 2 个 class 这样的:
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 是一种扩展方法,我使用它代替普通语法来通知 属性 更改,因为这样我不需要键入要更改的 属性 的名称作为字符串,所以我认为这与问题无关。如果需要我会 post 它。
我想将 MyClass2.Property2 绑定到 Rectangle.Fill。
为此,我必须创建一个 IMultiValueConverter,它将在 Property1 的字典中查找 Property2 并且 return 它的颜色。
在我的 XAML 中,我为我的转换器创建了一个条目 class:
<local:MaterialConverter x:Key="MaterialsConverter" />
然后我尝试多重绑定矩形:
<Rectangle>
<Rectangle.Fill>
<SolidColorBrush>
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource MaterialsConverter}">
<Binding Path=Property1 />
<Binding Path=Property2 />
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
<Rectangle.Fill/>
</Rectangle>
在表单代码中,我有这 2 个 classes 的 2 个变量:分别是 classObj1 和 classObj2。
初始化并设置它们后,我这样做是为了绑定:
rectangle.DataContext = class1Obj;
当然它不起作用,因为它是一个多重绑定,我在 DataContext 中只指定了 1 个元素,但我收到一条错误消息,指出 Property2 在 MyClass1 上不存在。
我不认为我可以为一个对象设置 2 个 DataContext,但我可以以某种方式设置 XAML 中 2 个绑定之一的源 属性,所以一个绑定会出现来自矩形的 DataContext,另一个来自另一个地方。但是我可以把 class2Obj 放在哪里呢?
您可以使用 Steven Rands 的建议:
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource MaterialsConverter}">
<Binding Path="Property1" Source="{StaticResource MyClass1}" />
<Binding Path="Property2" Source="{StaticResource MyClass2}" />
</MultiBinding>
</SolidColorBrush.Color>
或者您可以使用第三个 class 作为矩形的 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" />
这是一个应该对您有所帮助的示例。让我们从 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[=26= 类型]:
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>
我有 2 个 class 这样的:
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 是一种扩展方法,我使用它代替普通语法来通知 属性 更改,因为这样我不需要键入要更改的 属性 的名称作为字符串,所以我认为这与问题无关。如果需要我会 post 它。
我想将 MyClass2.Property2 绑定到 Rectangle.Fill。
为此,我必须创建一个 IMultiValueConverter,它将在 Property1 的字典中查找 Property2 并且 return 它的颜色。
在我的 XAML 中,我为我的转换器创建了一个条目 class:
<local:MaterialConverter x:Key="MaterialsConverter" />
然后我尝试多重绑定矩形:
<Rectangle>
<Rectangle.Fill>
<SolidColorBrush>
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource MaterialsConverter}">
<Binding Path=Property1 />
<Binding Path=Property2 />
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
<Rectangle.Fill/>
</Rectangle>
在表单代码中,我有这 2 个 classes 的 2 个变量:分别是 classObj1 和 classObj2。
初始化并设置它们后,我这样做是为了绑定:
rectangle.DataContext = class1Obj;
当然它不起作用,因为它是一个多重绑定,我在 DataContext 中只指定了 1 个元素,但我收到一条错误消息,指出 Property2 在 MyClass1 上不存在。
我不认为我可以为一个对象设置 2 个 DataContext,但我可以以某种方式设置 XAML 中 2 个绑定之一的源 属性,所以一个绑定会出现来自矩形的 DataContext,另一个来自另一个地方。但是我可以把 class2Obj 放在哪里呢?
您可以使用 Steven Rands 的建议:
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource MaterialsConverter}">
<Binding Path="Property1" Source="{StaticResource MyClass1}" />
<Binding Path="Property2" Source="{StaticResource MyClass2}" />
</MultiBinding>
</SolidColorBrush.Color>
或者您可以使用第三个 class 作为矩形的 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" />
这是一个应该对您有所帮助的示例。让我们从 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[=26= 类型]:
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>