Инициализация статического ресурса из кода в приложении C # WPF - PullRequest
3 голосов
/ 14 марта 2011

У меня есть два окна WPF.Главный содержит сетку, привязанную к ObservableCollection<Person>.Я могу добавлять и удалять объекты (людей) из списка.У меня также есть другое окно, которое я могу показать, когда я изменяю человека.

Человек имеет три свойства: Имя, Фамилия и Возраст и правильно реализует INotifyPropertyChanged.В новом окне у меня есть 3 текстовых поля, которые связаны со статическим ресурсом Person с именем person.

Когда я инициализирую новое окно, я предоставляю объект Person конструктору, а затем хочу, чтобы свойства этого персонажа отображались втри текстовых поля.

Когда приведенный ниже код выглядит следующим образом, все работает правильно:

public ModifyPerson(Person modPerson)  
{  
    // ... some code  
    Person p = this.Resources["person"] as Person;  
    p.Name = modPerson.Name;  
    p.LastName = modPerson.LastName;  
    p.Age = modPerson.Age;  
}  

Однако я предпочитаю делать это так:

public ModifyPerson(Person modPerson)  
{  
    // ... some code  
    this.Resources["person"] = modPerson;  
}

Но тогда этоне работает.(Ресурс назначен правильно, но в текстовых полях отсутствуют значения свойств modPerson.

Как это можно решить?

Ответы [ 3 ]

1 голос
/ 07 января 2014

Человек - ваш model объект.Вместо использования в качестве StaticResource поместите его в свойство, к которому вы привязываете.

public ModifyPerson(Person modPerson)
{
    personToModify = modPerson;
}

private Person personToModify;

public Person PersonToModify
{
    get
    {
        return personToModify;
    }
}

И XAML:

<StackPanel DataContext="{Binding PersonToModify}">
    <TextBox Text="{Binding Name, Mode=TwoWay" />
    <TextBox Text="{Binding LastName, Mode=TwoWay" />
    <TextBox Text="{Binding Age, Mode=TwoWay" />
</StackPanel>

(я опускал метки, чтобы быть кратким)

Вы можете использовать DynamicResource вместо StaticResource, но использование любого из них для вашего Model на самом деле не является их предназначением, и вместо этого вам следует использовать Binding.

0 голосов
/ 14 марта 2011

в XAML:

<TextBox Text="{Binding Name}"></TextBox>
<TextBox Text="{Binding LastName}"></TextBox>
<TextBox Text="{Binding Age}"></TextBox>

в коде: вам нужна копия для привязки пользовательского интерфейса, например,

public EditPlayerWindow(PlayerBO arg)
        : this() {
        this.source =arg;
        this.view = new PlayerBO();
        arg.CopyTo(this.view);
        this.DataContext = view;
    }

, например, CopyTo:

public void CopyTo(PlayerBO player) {
player.Id = this.Id;
player.Name = this.Name;
player.CurrentPolicyVersion = this.CurrentPolicyVersion;
player.CreatedAt = this.CreatedAt;
player.UpdatedAt = this.UpdatedAt;
player.Description = this.Description;
player.MACAddress = this.MACAddress;
player.IPAddress = this.IPAddress;
player.Policy = Policy;

}

Наконец:

view.CopyTo(source);

затем сохраните источник.

Пусть это поможет!

0 голосов
/ 14 марта 2011

Попробуйте использовать DynamicResource вместо StaticResource

...