通过多个 .xaml 文件进行数据绑定

Posted

技术标签:

【中文标题】通过多个 .xaml 文件进行数据绑定【英文标题】:Databind through multiple .xaml files 【发布时间】:2022-01-16 00:29:30 【问题描述】:

我正在尝试在我的资源字典中创建一个标准 UI 元素(内容控件),这样我只需通过属性将数据发送给它,就可以轻松地在我的用户控件上创建多个圆形图。

我现在想将 (Livecharts.WPF NuGet 包的一部分)的 Series="Binding SeriesCollection" 属性绑定到我的 resourceDictionary 项。这样我希望我可以保持图形的布局相同,只需通过分配正确的属性名称来发送数据。

绘制图形的 Xaml 代码(让我们说 Window.xaml 以供进一步参考):

<ContentControl x:Name="CircGraphCrypto" Style="StaticResource circularGraphStocks" local:IconProperties.CircGraphSeriesBinding="SeriesCollection"/>

本地是我将传递 Xaml 后端代码中的 SeriesCollection 名称的地方。在这种情况下,名称是 SeriesCollection。

资源字典代码:

xmlns:local="clr-namespace:AutomationProject"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" 
   
<!-- Circular graph stocks -->
    <Style x:Key="circularGraphStocks" TargetType="x:Type ContentControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type ContentControl">
                    <Border Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" Grid.RowSpan="2" Style="StaticResource borderRounded">
                        <Grid Margin="5,10,5,5">
                            <lvc:PieChart Series="Binding Path=(local:IconProperties.CircGraphSeriesBinding), Mode=TwoWay, RelativeSource=RelativeSource Self" 
                                        LegendLocation="Right" InnerRadius="10" Margin="5,5,5,5" Foreground="White">
                                <lvc:PieChart.ChartLegend>
                                    <lvc:DefaultLegend BulletSize="20"></lvc:DefaultLegend>
                                </lvc:PieChart.ChartLegend>
                                <lvc:PieChart.DataTooltip>
                                    <lvc:DefaultTooltip BulletSize="20" Foreground="Black"></lvc:DefaultTooltip>
                                </lvc:PieChart.DataTooltip>
                            </lvc:PieChart>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

然后我尝试向

附楼盘代码:

 namespace AutomationProject

    public class IconProperties : DependencyObject
    
        public static DependencyProperty CircGraphSeriesBindingProperty =
       DependencyProperty.RegisterAttached("CircGraphSeriesBinding", typeof(string), typeof(IconProperties),
           new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Inherits));

        public static string GetCircGraphSeriesBinding(DependencyObject obj)
        
            string dataBinding = "Binding " + (string)obj.GetValue(CircGraphSeriesBindingProperty) + "";
            MessageBox.Show(dataBinding);
            return dataBinding;
        

        public static void SetCircGraphSeriesBinding(DependencyObject obj, string value)
        
            obj.SetValue(CircGraphSeriesBindingProperty, value);
        
    

【问题讨论】:

请注意,您不需要从 DependencyObject 派生来声明附加属性。最好声明public static class IconProperties ... 除此之外,从附加属性的 getter 返回除 (string)obj.GetValue(CircGraphSeriesBindingProperty) 以外的任何内容都是错误的。 Binding 表达式字符串根本没有意义,因为这样的表达式必须由 XAML 解析器解析才能转换为实际的 Binding。 嗯,我对这一切都很陌生,发现绑定很难完全理解。我看到的所有不同的解决方案只会让我感觉更糟:)。感谢您的信息。明天我将尝试实施。你也知道我应该在谷歌上看什么方向来解决我的问题吗?我应该返回一个绑定而不是一个说绑定的字符串吗? @JorisBeuls 您似乎误解了 Xaml 语法。您可以将其编写为 Xaml 中的文本,但不能将其视为字符串值。如果您仍想使用附加属性,则类型应为SeriesCollection 而不是字符串。如何连接属性和实际数据取决于您的项目。 【参考方案1】:

我最终制作了自定义用户控件 (WPF),这很容易让我可以做我需要的事情。使用 propdp 进行正常的依赖绑定就足够了。

    public partial class StockSingleDisplay : UserControl
        
        public string Title
        
            get  return (string)GetValue(TitleProperty); 
            set  SetValue(TitleProperty, value); 
        

        // Using a DependencyProperty as the backing store for Title.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(StockSingleDisplay), new PropertyMetadata("Test"));
     

绑定到后面的代码:

<UserControl Name="StockSingleDisplayWindow">
<Grid>
<TextBlock Text="Binding Title, ElementName=StockSingleDisplayWindow"/>
</Grid>

显示它的 Xaml 代码(命名空间是保存用户控件的文件夹):

xmlns:CustomStocks="clr-namespace:AutomationProject.CustomControls.Stocks"
<CustomStocks:StockSingleDisplay Title="Displayed Text"/>

【讨论】:

以上是关于通过多个 .xaml 文件进行数据绑定的主要内容,如果未能解决你的问题,请参考以下文章

对HandyControl中的Poptip进行数据绑定

WPF 列表控件数据源绑定多个数据集合方法

WPF 列表控件数据源绑定多个数据集合方法

C#如何在没有 XAML 的情况下创建到父元素的(两种方式)数据绑定

您可以在 XAML 属性数据绑定期间对超链接的 NavigateUri 属性进行 StringFormat 吗?

如何通过XAML,WPF中的数据绑定设置VisualState INITIALIZATION