Передать представление в viewmodel с табличкой данных - PullRequest
0 голосов
/ 17 мая 2010

У меня есть окно с именем ParameterEditorView с ParameterEditorViewModel как DataContextParameterEditorViewModel у меня есть список ParameterViewModelParameterEditorView у меня есть ItemsControl, чей ItemsSource привязан к списку ParameterViewModel в ParameterEditorViewModel.Мне нужно, чтобы ParameterViewModel имел ссылку на ParameterView (подробнее об этом позже).В разделе Resources ParameterEditorView я добавляю DataTemplate:

<DataTemplate DataType="{x:Type my:ParameterViewModel}" >
    <my:ParameterView HorizontalAlignment="Left"/> 
</DataTemplate>

Итак, как я могу передать ссылку на ParameterView, созданную для показа ParameterViewModel вЭто?

Причина, по которой мне нужен ParameterView в ParameterViewModel, заключается в следующем: у меня есть TextBox, свойство Text которого связано со свойством PropertyModelView.Name.Но я хочу отобразить строку по умолчанию, когда Name пусто или пусто.Я пытался установить значение свойства в строку по умолчанию, которую я хочу, когда это происходит, но TextBox.Text не устанавливается в этом сценарии.Я делаю что-то вроде этого:

private string _name;
public string Name
{
    get { return _name; }
    set
    {
        if (value == null || value.Length == 0)
            Name = _defaultName;
        else
            _name = value;
    }
}

Я также пытался специально установить режим привязки TextBox.Text на TwoWay, но безуспешно.Я думаю, что это защитный механизм, предотвращающий бесконечный цикл, но я точно не знаю.Любая помощь в этом направлении также будет высоко оценена.

Спасибо, Хосе Таварес

1 Ответ

1 голос
/ 17 мая 2010

{Binding} имеет FallbackValue, кстати.

Ваш вопрос, меня это смущает. Я бы предположил, что ваш PVM имеет коллекцию PV как публичную собственность, которая связана с пользовательским интерфейсом. Кроме того, я думаю, что вы смешиваете термины. Его Model-View-ViewModel, где ViewModel является DataContext для View, а модель предоставляется ViewModel через открытое свойство. Похоже, если вы привязываете окно к коллекции ViewModels, они на самом деле являются моделями. Это может показаться педантичным, но правильные условия помогут вам исследовать и задавать вопросы.

Другим решением было бы добавить конвертер в вашу привязку в сочетании с FallbackValue (мне пришлось это сделать, IIRC). Этот конвертер будет IValueConverter, который возвращает «DependencyProperty.UnsetValue», если строка пуста или пуста. Я думаю, что иногда это работает, потому что TextBox установит привязанное свойство к пустой строке, а не к нулю, если TB пуст. Вот небольшой пример, чтобы разжечь ваш свисток (работа не гарантируется; вам нужно отладить и настроить его):

public class ThisMightWorkConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, System.Globalization.CultureInfo culture)
    {
        var temp = value as string;
        if(string.IsNullOrWhiteSpace(temp))
            return System.Windows.DependencyProperty.UnsetValue;
        return temp;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, System.Globalization.CultureInfo culture)
    {
        return value; // you might need to change this
    }
}
...