Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态更新文本块内容的最佳实践_C#_Wpf_Data Binding - Fatal编程技术网

C# 动态更新文本块内容的最佳实践

C# 动态更新文本块内容的最佳实践,c#,wpf,data-binding,C#,Wpf,Data Binding,我正在使用带有TextBlock元素的UserControl编写一个WPF应用程序。此元素的内容取决于视图模型中的枚举(成功、挂起、错误等) 以下是TextBlock中不同状态的一些示例: 示例1-简单 <TextBlock> Please wait </TextBlock> 请稍等 示例2-带有超链接 <TextBlock> Searching for item. <Hyperlink Command="{Binding DetailsC

我正在使用带有TextBlock元素的UserControl编写一个WPF应用程序。此元素的内容取决于视图模型中的枚举(成功、挂起、错误等)

以下是TextBlock中不同状态的一些示例:

示例1-简单

<TextBlock>
  Please wait
</TextBlock>

请稍等
示例2-带有超链接

<TextBlock>
  Searching for item. <Hyperlink Command="{Binding DetailsCommand}">Link to details</Hyperlink>
</TextBlock>
<TextBlock>
  The content has been uploaded<LineBreak />
  The item is not ready to use
</TextBlock>

正在搜索项目。链接到详细信息
示例3-带换行符

<TextBlock>
  Searching for item. <Hyperlink Command="{Binding DetailsCommand}">Link to details</Hyperlink>
</TextBlock>
<TextBlock>
  The content has been uploaded<LineBreak />
  The item is not ready to use
</TextBlock>

内容已经上传
该项目尚未准备好使用

根据视图模型中枚举的状态动态更改此元素内容的最佳方法是什么?如果将Text属性绑定到视图模型中的字符串,我认为我无法插入子元素,如超链接、换行符等。我有哪些选项?

您可以使用标签作为主体,并根据触发器设置模板

    <Label>
        <Label.Style>
            <Style TargetType="Label">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding YourEnum}" Value="something">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <TextBlock>
                                        Please wait
                                    </TextBlock>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding YourEnum}" Value="somethingElse">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <TextBlock>
                                        Searching for item. <Hyperlink Command="{Binding DetailsCommand}">Link to details</Hyperlink>
                                    </TextBlock>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding YourEnum}" Value="else">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <TextBlock>
                                        The content has been uploaded<LineBreak />
                                        The item is not ready to use
                                    </TextBlock>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Label.Style>
    </Label>

请稍等
正在搜索项目。链接到详细信息
内容已经上传
该项目尚未准备好使用

我将使用TemplateSelector实现它:

public class TemplSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
    var element = container as FrameworkElement;

    if (element != null && item != null)
    {
        var vm = (ViewModel)item;

        if (vm.YourEnum == 1)
            return element.FindResource("templ1") as DataTemplate;
        else if (vm.YourEnum == 0)
            return element.FindResource("templ0") as DataTemplate;
    }

    return null;
}
}
<Window.Resources>
    <local:TemplSelector x:Key="templSel"/>        
</Window.Resources>
<ContentPresenter ContentTemplateSelector="{StaticResource templSel}" Content="{Binding ViewModel}">
    <ContentPresenter.Resources>
        <DataTemplate x:Key="templ0">
            <TextBlock>
                Please wait
            </TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="templ1">
            <TextBlock>
                Searching for item. <Hyperlink Command="{Binding DetailsCommand}">Link to details</Hyperlink>
            </TextBlock>
        </DataTemplate>
    </ContentPresenter.Resources>
</ContentPresenter>
公共类TempleSelector:DataTemplateSelector
{
公共覆盖数据模板SelectTemplate(对象项,DependencyObject容器)
{
var元素=容器作为框架元素;
if(元素!=null&&item!=null)
{
var vm=(ViewModel)项;
if(vm.YourEnum==1)
返回元素.FindResource(“temp1”)作为DataTemplate;
else if(vm.YourEnum==0)
返回元素.FindResource(“temp0”)作为DataTemplate;
}
返回null;
}
}
请稍等
正在搜索项目。链接到详细信息

我很久以前写过一个简洁的自定义控件,
ConditionalPresenter
,我应该用它或其他东西创建一个Nuget包。。。。