如何使用绑定

时间:2016-01-11 09:29:11

标签: c# .net wpf xaml data-binding

方案

我的window.xaml中有以下一组代码:

<Window x:Class="MD.UI.EntryPoint.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:UICore="http://schemas.MasterData.io/Core/"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/MD.UI.Core;component/Themes/Generic.xaml"></ResourceDictionary>
                <!--<ResourceDictionary Source="{DynamicResource }"></ResourceDictionary>-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Name="btnShow" Content="Show" HorizontalAlignment="Left" Margin="329,172,0,0" VerticalAlignment="Top" Width="83" Height="22" Click="btnShow_Click"/>
    </Grid>
</Window>

如果您熟悉XAML,那么您可以理解Generic.xaml已在单独的项目中定义(dll),此项目中引用了MD.UI.Core名称Generic.xaml 一切正常。表示MD.UI.Core主题正常工作。

问题

http://schemas.MasterData.io/Core/此处还有XmlnsDefinition xmlns:UICore="http://schemas.MasterData.io/Core/" 用作:

xmlns:UICore

所以,虽然我已经在window.xaml内定义了/MD.UI.Core;component/Themes/Generic.xaml,但我还是不想再使用xmlns了。我想要做的是,使用ResourceDirectory.Source我想绑定<ResourceDictionary Source="{DynamicResource }"></ResourceDictionary> 属性,如:

UICore

修改

实际上我想直接使用<ResourceDictionary Source="{DynamicResource UICore:component/Themes/Generic.xaml}"></ResourceDictionary> 引用,如

something

Binding,但使用XAML markup表达Char.IsNumber

我不知道。如何定义上述?
你能帮我吗?

1 个答案:

答案 0 :(得分:0)

我的理解是,您要做的是能够动态选择主题(资源字典)。我通常在C#中这样做。例如,让我们假设我们有2个主题。第一个嵌入在当前组件中,第二个嵌入在外部组件中。让我们从 External.dll 中将它们称为 Internal.xaml External.xaml 。现在我们可以编写以下方法:

private static void SetStyle(bool useInternal)
{
    var res = Application.Current.Resources;
    res.MergedDictionaries.Clear();

    if (useInternal)
        res.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("pack://application:,,,/Internal.xaml")
        });
    else
        res.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("pack://application:,,,/External;component/External.xaml")
        });
}

此方法已简化,因为假设MergedDictionaries集合中只能有一个项目。但是,它显示了一个想法。实际上,您可以相应地在MergedDictionaries集合中添加/删除资源。

还值得指出上面的SetStyle方法使用全局资源字典。如果需要,您可以对本地词典执行相同操作,例如对于特定窗口甚至控件。