在我的程序中,我想从代码隐藏中实现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..."} }
}
}
};
}
:
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中处理它。
答案 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回答有关静态事件及其订阅的潜在问题。