Связывание WPF через StaticResouces - PullRequest
0 голосов
/ 10 июня 2011

Учитывая следующее Xaml:

<Window.Resources>
    <System:String x:Key="StringValue"></System:String>
</Window.Resources>
    <Grid>
        <ComboBox Margin="137,101,169,183" ItemsSource="{Binding collection}" SnapsToDevicePixels="True" IsHitTestVisible="true">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                <CheckBox Command="{Binding CheckCommand}" IsChecked="{Binding IsChecked}" Content="{Binding Name}"/>
                    <TextBlock Text="{StaticResource StringValue}" />
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</Grid>

Я хочу, чтобы текст Textblock был привязан к статическому ресурсу, который привязан к значению в ViewModel. Проблема в System.String, по-видимому, не позволяет привязку данных. Кто-нибудь знает способ сделать это? Для контекста, TextBlock нуждается в другом элементе источника, чем у его родительского выпадающего списка.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

String не разрешает привязку, потому что она не является DependencyObject (и не реализует INotifyPropertyChanged)

, но почему бы вам просто не связать напрямую со значением в ViewModel?

, если вы не можете привязатьViewModel (подумайте о RelativeSource с поиском типа Parent), вы можете реализовать оболочку (которая реализует INotifyPropertyChanged для получения изменений в объекте)

Пример класса оболочки:

public class BindWrapper<T> : INotifyPropertyChanged
{
    private T _Content;
    public T Content
    {
        get
        {
            return _Content; 
        }
        set
        {
            _Content = value;
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs("Content"));
        }
    }


    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

как создать экземпляри связать в XAML:

<Window.Resources>
    <local:BindWrapper x:Key="wrapper" x:TypeArguments="System:String">
        <local:BindWrapper.Content>
            <System:String>huuu</System:String>
        </local:BindWrapper.Content>
    </local:BindWrapper>
</Window.Resources>
<TextBlock Text="{Binding Source={StaticResource wrapper}, Path=Content}" />
0 голосов
/ 10 июня 2011

Для пояснения, A System.String не имеет свойств зависимости, поэтому вы ничего не можете связать.Я думаю, что вам нужен конвертер, чтобы ваш TextBlock мог связываться с View Model.Какой тип ObservableCollection у вас есть в модели просмотра?

РЕДАКТИРОВАТЬ Если вы просто хотите связать простую строку со свойством text, это неправильный ответ.Если вы хотите привязать к форматированному тексту, читайте дальше.

У меня была эта проблема раньше.Я хотел привязать свой TextBlock к строковому ресурсу в моих свойствах.В итоге я создал подклассы TextBlock для BindableTextBlock и создал конвертер для string в список Inline.

Вопросы и ответы здесь.

Можеткажется немного вовлеченным, должен быть более легкий путь.Однако я несколько раз использовал элемент управления всякий раз, когда мне нужно было привязать к некоторому форматированному тексту, и это работает.Надеюсь, вы сможете извлечь выгоду из моей работы и, возможно, улучшить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...