gpt4 book ai didi

c# - 加载的 XAML 未正确绑定(bind)到现有元素

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:21 26 4
gpt4 key购买 nike

我有一个按钮,可以从文件加载 XAML,从中创建一个控件,并将此控件作为子控件添加到 Canvas 中,该 Canvas 是窗口停靠面板资源中存在的模板的一部分。该窗口还有一个名为 cboTColour 的组合框和一个名为 cboBColour 的组合框,我用它们在加载的控件上设置简单的渐变背景。

我使用以下代码加载 XAML 并将其添加到我的 Canvas 中:

XmlReader xaml = XmlReader.Create(filename);
newControl = (Viewbox)XamlReader.Load(xaml);
((Canvas)(testButton.Template.FindName("MyCanvas", testButton))).Children.Clear();
((Canvas)(testButton.Template.FindName("MyCanvas", testButton))).Children.Add(newControl);

这是我加载的 XAML:

<?xml version="1.0" encoding="utf-8"?>
<Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Document" Stretch="Fill">
<Canvas Height="64" Width="128" ClipToBounds="True">
<Canvas.Background>
<!--Horizontal Gradient-->
<LinearGradientBrush StartPoint="1,0">
<GradientStop Color="{Binding ElementName=cboTColour, Path=SelectedItem.Name}" Offset="0"></GradientStop>
<GradientStop Color="{Binding ElementName=cboBColour, Path=SelectedItem.Name}" Offset="1"></GradientStop>
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Viewbox>

我已经尝试将 XAML 直接放入设计器中并且它工作得很好,所以这不是问题。当我从文件加载 XAML 时,正在正确创建和放置控件,但数据绑定(bind)不起作用 - 颜色没有改变。我收到以下错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=cboTColour'. BindingExpression:Path=SelectedItem.Name; DataItem=null; target element is 'GradientStop' (HashCode=24393646); target property is 'Color' (type 'Color')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=cboBColour'. BindingExpression:Path=SelectedItem.Name; DataItem=null; target element is 'GradientStop' (HashCode=23972246); target property is 'Color' (type 'Color')

我假设发生的事情是当 XAMLReader 加载 xaml 广告并从中创建一个控件时,它不确定到我的组合框的路径,因为 xaml 还不是窗口的一部分,并且当控件是添加到窗口后,此绑定(bind)不会更新,但我不知道如何修改 XAML 中的绑定(bind)以反射(reflect)我的组合框相对于它的位置或修改 XAMLReader 或整体数据上下文以获取考虑到我的控制。我还可以向您保证,此时已创建组合框,因为当在组合框所在的窗口上按下按钮时代码会运行。

我必须指定我不能在代码中修改绑定(bind)本身,因为绑定(bind)将出现在我将加载的不同 XAML 文件中的不同位置和不同时间。

如有任何帮助,我们将不胜感激。

最佳答案

看起来 XamlReader 对其加载的 xaml 进行了限制,因此它不能包含未在加载的 xml 中定义的未知元素名称。而是使用数据绑定(bind)到工作正常但需要一些代码的属性。当用户更改组合框的选定项目时,下面的代码将更改加载控件的背景。您需要添加一个值转换器,将颜色转换为供组合框使用的人类可读名称。

XAML:

<StackPanel>
<ComboBox
ItemsSource="{Binding Path=AvailableColors}"
SelectedValuePath="Color"
SelectedValue="{Binding Path=SelectedColors[color0].Color}" />
<ComboBox
ItemsSource="{Binding Path=AvailableColors}"
SelectedValuePath="Color"
SelectedValue="{Binding Path=SelectedColors[color1].Color}" />
<ContentControl Name="newControl" />
</StackPanel>

代码隐藏:

using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Media;
using System.Xml;

namespace LoadTest
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();

SelectedColors = new Dictionary<string, ColorInfo>();
SelectedColors.Add("color0", AvailableColors.First());
SelectedColors.Add("color1", AvailableColors.Last());

XmlReader xaml = XmlReader.Create("newcontrol.xml");
newControl.Content = XamlReader.Load(xaml);
newControl.DataContext = SelectedColors;

DataContext = this;
}

public List<ColorInfo> AvailableColors
{
get
{
return new List<ColorInfo>()
{
new ColorInfo() {Color = Colors.Red },
new ColorInfo() { Color = Colors.Green },
new ColorInfo() { Color = Colors.Blue },
new ColorInfo() { Color = Colors.Yellow }
};
}
}

public Dictionary<string, ColorInfo> SelectedColors { get; private set;}
}

public class ColorInfo : INotifyPropertyChanged
{
private Color _color;
public Color Color
{
get { return _color; }
set
{
_color = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Color"));
}
}
}

public event PropertyChangedEventHandler PropertyChanged;
}
}

要加载的 XAML 文件 (newcontrol.xml):

<?xml version="1.0" encoding="utf-8"?>
<Viewbox
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Document" Stretch="Fill">
<Canvas Height="64" Width="128" ClipToBounds="True">
<Canvas.Background>
<LinearGradientBrush StartPoint="1,0">
<GradientStop Color="{Binding Path=[color0].Color}" Offset="0" />
<GradientStop Color="{Binding Path=[color1].Color}" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Viewbox>

关于c# - 加载的 XAML 未正确绑定(bind)到现有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com