Стилизация заголовка ChildWindow

Я новичок в С# и wpf. У меня есть ChildWindow, заголовок которого устанавливается вне класса. Мне нужно, чтобы название было сокращено многоточием в конце, если оно слишком длинное. Я выполнил это (код сокращен):

<Namespace:ChildWindow
         x:Class="Namespace.MyClass">
     <Namespace:ChildWindow.Title>
         <TextBlock x:Name="_titleBlock" Width="300" TextTrimming="WordEllipsis"/>
     </Namespace:ChildWindow.Title>
</Namespace:Childwindow>

Однако я хотел бы, чтобы вызывающий объект этого класса мог установить ChildWindow.Title = "Something long", а не ChildWindow._titleBlock = "Something long", потому что я думаю, что это имеет больше смысла. Можно ли как-то это сделать через события?


person minus    schedule 08.12.2011    source источник


Ответы (1)


Что вам действительно нужно сделать, так это использовать шаблон MVVM, чтобы разделить логика с вашей точки зрения. Таким образом, вы можете передать ViewModel объекту, управляющему дочерним окном, а не самому дочернему окну.

Например, базовая ViewModel для дочернего окна может быть:

public class ChildWindowViewModel: INotifyPropertyChanged {
    private string _title;

    public string Title{
        get { return _title; }
        set{if (value != _title){
            _title = value;
            OnPropertyChanged("Title");
        }}
    }

    private void OnPropertyChanged(string propertyName){
        var handle = PropertyChanged;
        if (handle != null){
            handle(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Затем вы устанавливаете DataContext в модель представления при создании дочернего окна следующим образом:

//Creating the child window
ChildWindow child = new ChildWindow();
ChildWindowViewModel childViewModel = new ChildWindowViewModel();
child.DataContext = childViewModel;
//do stuff with child...

и подключите заголовок дочерних окон к ViewModel в Xaml следующим образом:

<Namespace:ChildWindow
         x:Class="Namespace.MyClass">
     <Namespace:ChildWindow.Title>
         <TextBlock Width="300" TextTrimming="WordEllipsis" Text="{Binding Path=Title}/>
     </Namespace:ChildWindow.Title>
</Namespace:Childwindow>

Затем, когда вы хотите изменить заголовок, вы можете использовать

childViewModel.Title = "A Very Long Title That Will Be Cut Short In Its Prime";

Установка заголовка в ViewModel вызовет событие PropertyChanged, которое заставит представление Xaml обновить себя новым установленным значением. Это может показаться ОЧЕНЬ запутанным способом ведения дел, но если вы подумаете о том, что это позволяет вам делать за несколько минут, вы увидите огромные преимущества. Привязка выходит далеко за рамки простого текста заголовков...

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

person Russell Troywest    schedule 08.12.2011