如何在C#中控制DynamicResource实现

时间:2013-11-19 18:27:03

标签: c# wpf resourcedictionary dynamicresource

在我的程序中,我想从代码隐藏中实现DynamicResource。现在我将Content的{​​{1}}绑定到我的数据模型中的Label属性...

string

关注this question后,我在我的数据模型中实现了<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

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

UPDATE 1:根据@HighCore的要求,这是我的代码示例,我只能访问代码-Beyhind(或C#class)中的<Label Content="{DynamicResource nameOfResource}" ... />

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

TreeView

这是上述//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

更新2:我还有另一个完美的问题示例......

我有一个<!-- Tree view items & Functions --> <TreeView ItemsSource="{Binding DataTree.Data}" ... /> ,其comboBox绑定到我的数据模型中的itemsSource。像这样:

ObservableCollection

XAML:

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 {...}

如果我想这样做,以便在更改资源字典时此<ComboBox ItemsSource="{Binding DataModel.ObjCollection}" ... /> 中的项目发生更改,看起来我需要在C#而不是xaml中处理它。

1 个答案:

答案 0 :(得分:1)

在OP的更新2 并且chat与他different question之后,我明白他正在尝试为他的应用程序实现本地化。他会动态更改资源字典(针对不同的语言),他希望他的C#代码重新读取/加载来自Application.Current.Resources的值。

APPROACH ONE

更改资源字典后,您可以使用类似EventAggregator / Mediator的内容让应用程序的其他部分(包括ViewModels)了解资源字典更改,并通过重新响应它从Application.Current.Resources

加载/读取资源/值

APPROACH TWO

OP不希望引入任何新的依赖项,例如EventAggregator / Mediator。所以,我建议采用第二种方法。我知道,它不漂亮,但它在这里......

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

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