Как избежать текста по умолчанию в текстовом поле? - PullRequest
0 голосов
/ 25 января 2011

У меня есть текстовое поле, в котором используется множественное связывание с использованием StringFormat ... как показано ниже. Но он отображает значение по умолчанию как {DependencyProperty.UnsetValue}, {DependencyProperty.UnsetValue}

Как этого избежать?

<StackPanel Orientation="Horizontal">
                    <TextBlock Width="70" Text="Name:" Margin="5,2,2,2"></TextBlock>
                    <TextBox Width="160" DataContext="{Binding }" IsReadOnly="True" Margin="2">
                        <TextBox.Text>
                            <MultiBinding StringFormat="{}{0},{1}">
                                <Binding Path="LastName"/>
                                <Binding Path="FirstName"/>
                            </MultiBinding>
                        </TextBox.Text>
                    </TextBox>
</StackPanel>

Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 25 января 2011

Что-то не так с объектом, к которому вы привязаны. Я только что создал приложение с нуля с классом Person, который наследуется от DependencyObject. Я оставил свойства имени и фамилии неустановленными и не увидел DependencyProperty.UnsetValue, а пустое поле TextBox с запятой в нем.

(В общем, вы все равно не должны использовать свойства зависимостей для своих бизнес-объектов. Придерживайтесь INotifyPropertyChanged и избавьте себя от множества головных болей.)

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

public class Person : DependencyObject
{

    public static readonly DependencyProperty FirstNameProperty = DependencyProperty.Register("FirstName", typeof(string), typeof(Person), new FrameworkPropertyMetadata());

    public string FirstName {
        get { return (string)GetValue(FirstNameProperty); }
        set { SetValue(FirstNameProperty, value); }
    }

    public static readonly DependencyProperty LastNameProperty = DependencyProperty.Register("LastName", typeof(string), typeof(Person), new FrameworkPropertyMetadata());

    public string LastName {
        get { return (string)GetValue(LastNameProperty); }
        set { SetValue(LastNameProperty, value); }
    }

}

-

<TextBox IsReadOnly="True">
    <TextBox.Text>
        <MultiBinding StringFormat="{}{1}, {0}">
            <Binding Path="FirstName" />
            <Binding Path="LastName" />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

-

public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
    }

    private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        var p = new Person();
        //p.FirstName = "Josh";
        //p.LastName = "Einstein";          
        DataContext = p;
    }
}
0 голосов
/ 25 января 2011

просто укажите fallbackvalue = "" и посмотрите

<TextBox.Text>
                <MultiBinding StringFormat="{}{0},{1}">
                    <Binding Path="LastName" FallbackValue=""/>
                    <Binding Path="FirstName" FallbackValue=""/>
                </MultiBinding>
            </TextBox.Text>

Если привязка не удалась, т.е. не найден путь к источнику привязки или произошел сбой преобразователя значений, если таковой имеется, возвращается значение DependencyProperty.UnsetValue, тогда для свойства target установлено значение FallbackValue, если вы определили один конечно.

...