Переназначение значения StaticResource в коде позади - PullRequest
0 голосов
/ 23 февраля 2020

Я загружаю данные из файла и хочу назначить их представлению. Я использую тип привязки StaticResource в XAML, потому что в нем легче ориентироваться при определении представления.

Как переназначить значение StaticResource, определенного в XAML, только что загруженным данным?

XAML:

<Window.Resources>
    <local:Container x:Key="Container"/>
</Window.Resources>
<Grid>
    <ComboBox Name="Combo" 
              ItemsSource="{Binding Source={StaticResource Container}}" 
              HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>

Кодовый код:

public class Container : ObservableCollection<string>
{
    public Container()
    {
        Add("AAA");
    }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Container resource = FindResource("Container") as Container;

        Container container2 = new Container() { "BBB" };

        resource = container2;
    }
}

Здесь предполагается, что в Combobox есть «AAA» и «BBB», но код позади не меняет его. Я не могу установить его в DynamicResource, и использование интерфейса INotifyPropertyChanged не помогает.

Конечно, выполнение Combo.ItemsSource = container2; работает, но затем вынуждает меня установить все привязки элементов View в выделенном фрагменте кода. И как бы я тогда установил привязки RelativeSource для всех дочерних элементов, которым нужны данные из верхних уровней иерархии классов, т.е. теперь я могу сделать {Binding Source={StaticResource Container}, Path=TopClass.AnotherCollection.Value} внутри дочернего элемента.

1 Ответ

0 голосов
/ 24 февраля 2020

Так вы бы заменили реальный ресурс другим Container экземпляром:

this.Resources["Container"] = container2;

Но это не повлияет на ComboBox, если вы не используете DynamicResource в разметке XAML :

<ComboBox Name="Combo" 
          ItemsSource="{DynamicResource Container}" 
          HorizontalAlignment="Left" VerticalAlignment="Top"/>

Значение расширения разметки StaticResource разрешается только один раз.

...