2015-07-24 2 views
5

Там нет никаких проблем, если Mode = OneWay, но у меня есть это: Класс:WPF TwoWay Привязка к статическому классу недвижимости

namespace Halt 
{ 
    public class ProjectData 
    { 
      public static string Username {get;set;} 
    } 
} 

И XAML:

xmlns:engine="clr-namespace:Halt.Engine" 
<TextBox Name="UsernameTextBox" HorizontalAlignment="Stretch" Margin="10,5,10,0" Height="25" 
     Text="{Binding Source={x:Static engine:ProjectData.Username}, Mode=TwoWay}"/> 

Это Не хочу работу из-за Режим TwoWay. Итак, как это исправить?

ответ

2

Если привязка должна быть двусторонней, вы должны указать путь. Существует трюк для двусторонней привязки к статическому свойству, если класс не статичен: объявите фиктивный экземпляр класса в ресурсах и используйте его как источник привязки.

<Window.Resources> 
    <local:ProjectData x:Key="projectData"/> 
</Window.Resources> 
... 

<TextBox Name="UsernameTextBox" HorizontalAlignment="Stretch" Margin="10,5,10,0" Height="25" 
     Text="{Binding Source={StaticResource projectData}, Path=Username}"/> 
+0

Простой и легкий. Чище, чем ViewModel кстати. Большое спасибо! – Iworb

+1

Не так просто и просто, как в WPF 4.5. – Clemens

+0

не работает, если класс статичен – user1034912

2

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

public class ProjectData 
{ 
     public static string Username {get;set;} 
} 

public class ViewModel { 
    public string UserName { 
     get{ return ProjectData.Username ; } 
     set { ProjectData.Username = value; } 
    } 
} 

Затем я установил экземпляр ViewModel как UI DataContext ,

9

Используйте связывающую статическое свойство синтаксиса (который, насколько я знаю, доступен с WPF 4.5):

<TextBox Text="{Binding Path=(engine:ProjectData.Username)}"/> 

Нет необходимости устанавливать Mode="TwoWay", так как это по умолчанию для TextBox.Text собственность в любом случае.


Хотя явным образом не запрашивается, вы также можете применить уведомление об изменении свойства.

См. this answer, как это сделать.

+1

Без режима = Ошибка OneWay: "Ошибка Двусторонняя для привязки требуется Path или XPath. " – Iworb

+0

Тогда вы не использовали вышеупомянутый XAML. Прочтите внимательно и напишите связующий Путь точно так, как показано здесь. Убедитесь, что вы используете круглые скобки вместо фигурных скобок. Не устанавливайте 'Mode' вообще, особенно не устанавливайте' Mode = "OneWay" ', потому что это не то, что вы хотите. Я просто говорил вам, что привязка к свойству Text для TextBox по умолчанию является двусторонней, поэтому нет необходимости устанавливать этот режим. – Clemens

+0

Привет всем. Последующий вопрос: если вместо текстового поля и строки мы говорим о списке и массиве строк, как это можно сделать? – zazkapulsk

Смежные вопросы