gpt4 book ai didi

c# - 如何将 xaml 中的值分配给不可绑定(bind)的属性

转载 作者:行者123 更新时间:2023-11-30 22:19:57 26 4
gpt4 key购买 nike

我如何将以下代码编写为 XAML

假设我们有这段代码

        var myValue = someMethodeReturn(); // the return will fit

// could also be an other nonbindable property
var myTextBlock = new TextBlock();
myTextBlock.Inlines = myValue;

你会如何转换

       var myValue = someMethodeReturn(); 

myTextBlock.Inlines = myValue;

作为仅限XAML

当然第一部分看起来像???={Binding myProperty}第二部分像<TextBlock.Inlines><???/></TextBlock.Inlines> 但是会怎样 ???看起来像?

视觉结果应该是这样的(如果你执行你的解决方案)

    <TextBlock  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="LightGray" TextWrapping="WrapWithOverflow" >
<TextBlock.Inlines>
<Run>meine sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr lange run 1</Run>
<Run Foreground="Green" FontFamily='Palatino Linotype' Typography.Variants='Superscript'>meine run2</Run>
<Run>meine sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr lange run</Run>
<Run Foreground="LimeGreen" Background="Yellow">meine run3</Run>
<Run>meine sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr lange run</Run>
</TextBlock.Inlines>
</TextBlock>

我测试了 ItemsControlTextBlock.Inlines 之间标签,但它返回默认的 TextBlocks,我无法设置 RunInLine作为ItemTemplate

我想我只需要一个 Control返回 List<Inline>但我不知道哪个Control将能够做到这一点

如有任何建议,我们将不胜感激

我尝试了以下想法

首先

<TextBlock  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="LightGray" TextWrapping="WrapWithOverflow" >
<TextBlock.Inlines>
<ContentControl Content="{Binding myBinding}"/>
</TextBlock.Inlines>
</TextBlock>

仅返回“(Auflistung)”作为文本

第二

    <TextBlock  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="LightGray" TextWrapping="WrapWithOverflow" >
<TextBlock.Inlines>
<ItemsControl ItemsSource="{Binding myBinding}"/>
</TextBlock.Inlines>
</TextBlock>

返回包含在 ContenPresenter 中的文本框列表

最佳答案

创建可绑定(bind)的 Inlines 附加属性如下:

Bindable.cs

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace WpfApplication
{
public static class Bindable
{
public static readonly DependencyProperty InlinesProperty = DependencyProperty.RegisterAttached("Inlines", typeof(IEnumerable<Inline>), typeof(Bindable), new PropertyMetadata(OnInlinesChanged));

private static void OnInlinesChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
var textBlock = source as TextBlock;

if (textBlock != null)
{
textBlock.Inlines.Clear();
var inlines = e.NewValue as IEnumerable<Inline>;
if (inlines != null)
textBlock.Inlines.AddRange(inlines);
}
}

[AttachedPropertyBrowsableForType(typeof(TextBlock))]
public static IEnumerable<Inline> GetInlines(this TextBlock textBlock)
{
return (IEnumerable<Inline>)textBlock.GetValue(InlinesProperty);
}

public static void SetInlines(this TextBlock textBlock, IEnumerable<Inline> inlines)
{
textBlock.SetValue(InlinesProperty, inlines);
}
}
}

然后像这样使用它:

MyViewModel.cs

using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;

namespace WpfApplication
{
public class MyViewModel
{
// This is against MVVM principle - to contain views (Inlines) in view model, but I don't want to complicate by creating ViewModel class for each Inline derived class.
public IEnumerable<Inline> Inlines { get; private set; }

public MyViewModel()
{
this.Inlines = new Inline[]
{
new Run("meine sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr lange run 1"),
new Run("meine run2") { Foreground = Brushes.Green, Typography = { Variants = FontVariants.Superscript } },
new Run("meine sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr lange run"),
new Run("meine run3") { Foreground = Brushes.LimeGreen, Background = Brushes.Yellow },
new Run("meine sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr lange run")
};
}
}
}

MainWindow.xaml

<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication">
<Window.DataContext>
<local:MyViewModel/>
</Window.DataContext>
<TextBlock local:Bindable.Inlines="{Binding Inlines}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="LightGray" TextWrapping="WrapWithOverflow"/>
</Window>

关于c# - 如何将 xaml 中的值分配给不可绑定(bind)的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295924/

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