簡體   English   中英

綁定到控件模板

[英]Binding to a Control Template

我需要將按鈕綁定到控件模板。 XAML 看起來像這樣:

Button Template="{Binding Status, Converter={StaticResource StatustoTemplate}}"

當狀態(它是一個整數,但很高興它是一個字符串)改變時,轉換器( StatustoTemplate )運行良好:

public class StatustoTemplate : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {
           if (value==1)
           {
               return ControlTemplateName1;
           }
           if (value==2)
           {
               return ControlTemplateName2;
           }
        }
}

現在,我可以用什么格式發回ControlTemplate1ControlTemplate2 讓我們假設ControlTemplate1ControlTemplate2是 XAML 中定義的有效控制模板。 我現在需要返回 ControlTemplate - 但是如何設置它?

我的首選方法是使用帶有 DataTriggers 的 Style 來切換模板,而無需轉換器

<Style TargetType="Button" x:Key="StatusButton"> <!--set BasedOn if there is a base Style-->
   <Style.Triggers>
       <DataTrigger Binding="{Binding Status}" Value="1">
           <Setter Property="Template" Value="{StaticResource ControlTemplateName1}"/>
       </DataTrigger>

        <DataTrigger Binding="{Binding Status}" Value="2">
            <Setter Property="Template" Value="{StaticResource ControlTemplateName2}"/>
        </DataTrigger>
    </Style.Triggers>
</Style> 

然后應用此樣式:

<Button Style="{StaticResource StatusButton}"/>

轉換器不容易找到 XAML 中定義的資源。 我通常定義一個具有兩個定義的控件模板,並使用Visibility切換它們。 該代碼只是一個簡短的示例。

XAML

<Window>
    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    <Window.Resources>
        <ResourceDictionary>
            <local:MyConverter x:Key="MyConverter"/>
            <ControlTemplate x:Key="template">
                <Grid>
                    <Grid Visibility="{Binding Status, Converter={StaticResource MyConverter}, ConverterParameter=1}">
                        <TextBox Text="1"/>
                    </Grid>
                    <Grid Visibility="{Binding Status, Converter={StaticResource MyConverter}, ConverterParameter=2}">
                        <TextBox Text="2"/>
                    </Grid>
                </Grid>
            </ControlTemplate>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Template="{StaticResource template}"/>
    </Grid>
</Window>

轉換器

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((string)parameter == "1") ? Visibility.Visible : Visibility.Collapsed;
    }

    // ConvertBack
}

我有一個可能適合你的MarkupExtension 它越來越XAML定義ResourcesResourceKey

第一:抽象類 StyleRefExtension:

public abstract class StyleRefExtension : MarkupExtension
{
    protected static ResourceDictionary RD;
    public string ResourceKey { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return ProvideValue();
    }

    public object ProvideValue()
    {
        if (RD == null)
            throw new Exception(
                @"You should define RD before usage. 
            Please make it in static constructor of extending class!");
        return RD[ResourceKey];
    }
}

第二:類實現為 StyleRefExt

public class StyleRefExt : StyleRefExtension
{
    static StyleRefExt()
    {
        RD = new ResourceDictionary
             {
                 Source = new Uri("pack://application:,,,/##YOUR_ASSEMBLYNAME##;component/Styles/##YOUR_RESOURCE_DICTIONARY_FILE##.xaml")
             };
    }
}

只需將##YOUR_ASSEMBLYNAME##替換為您的程序集名稱,並將##YOUR_RESOURCE_DICTIONARY_FILE##替換為您的ResourceDictionary的文件名(位於文件夾Styles )。

您的Converter應如下所示:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (value==1) {
        StyleRefExt sr = new StyleRefExt {ResourceKey = "ControlTemplateName1"};
        return sr.ProvideValue();
    }
    if (value==2) {
        StyleRefExt sr = new StyleRefExt {ResourceKey = "ControlTemplateName2"};
        return sr.ProvideValue();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM