1

在我的程序中,我想DynamicResource从代码隐藏中实现一个。现在我正在将 a 绑定Content到我的数据模型中的Label一个string属性......

<Label Content="{Binding DataModel.StringValue}" ... />

这个问题之后,我string在我的数据模型中实现了这样的:

private string _stringValue = (string)Application.Current.Resources["nameOfResource"];
public string StringValue
{
    get { return _cartsInSystem; }
    set
    {
        _cartsInSystem = value;
        NotifyPropertyChange(() => CartsInSystem);
    }
}

我想让它每次用户更改资源字典时,这个string值都会更新为新值。

我试图达到与这样的效果相同的效果:

<Label Content="{DynamicResource nameOfResource}" ... />

请让我知道我做错了什么,以及如何正确实现这样的事情。

更新 1:根据@HighCore 的要求,这是我的代码示例,我只能访问string来自代码隐藏(或 C# 类)的值

(这是TreeView我的 MainWindow 中的 ViewModel 的一部分)

//The "DisplayNames" for these nodes are created here and not accessible through xaml.
//This is because the xaml window has access to this code through it's itemsSource
private HierarchicalVM CreateCartsNode()
{   
    return new HierarchicalVM()
    {
        DisplayName = "Carts",
        Children = 
        { 
            new CartConnection() { ConnectionDataModel = new CartConnectionModel(), DisplayName = "Cart Connection" }, 
            new HierarchicalVM() {
                DisplayName = "Cart Types",
                Children = {
                    CreateCartType( new CartConfigModel() { DisplayName = "Default" }, new CartIO_Model() ),
                },
                Commands = { new Command(OpenAddCart) {DisplayName = "Add..."} }
            }
        }
    };
 }

这是上面的xaml TreeView

<!-- Tree view items & Functions -->
<TreeView ItemsSource="{Binding DataTree.Data}" ... />

更新 2:我有另一个完美的例子来说明我的问题......

我有一个绑定到我的数据模型中comboBox的一个。像这样:itemsSourceObservableCollection

private ObservableCollection<string> _objCollection;
private string _notUsed = "Not Used";
private string _stop = "Stop";
private string _slow = "Slow";

public DataModel()
{
    ObjCollection = new ObservableCollection<string>() { _notUsed, _stop, _slow };
}

public ObservableCollection<string> ObjCollection {...}

xml:

<ComboBox ItemsSource="{Binding DataModel.ObjCollection}" ... />

如果我想让它comboBox在资源字典更改时更改此项目,看起来我需要在 C# 而不是 xaml 中处理它。

4

1 回答 1

1

在 OP 的UPDATE 2并与他了一个不同的问题之后,我知道他正在尝试为他的应用程序实现本地化。他会即时更改资源字典(针对不同的语言),并且他希望他的 C# 代码从Application.Current.Resources.

方法一

更改资源字典后,您可以使用EventAggregator/之类的东西Mediator让应用程序的其他部分(包括 ViewModels)知道资源字典的更改,并通过重新加载/读取资源/值来响应它Application.Current.Resources

方法二

OP 不想引入任何新的依赖项,例如EventAggregator/ Mediator。所以,我提出了第二种方法。我知道,它不漂亮,但它就在这里..

您可以使用全局静态事件而不是 EventAggregator/Mediaotr 来让应用程序的其他部分知道您交换了资源字典,并且它们将重新加载/读取值。

阅读有关静态事件及其订阅的潜在问题的答案

于 2013-11-20T22:46:46.737 回答