Używam tego:Jak powiązać właściwość SelectionStart w polu tekstowym?
<TextBox x:Name="Test"/>
<TextBlock Text="{Binding SelectionStart, ElementName=Test}"/>
ale zawsze pokazuje 0.
Jak mogę leczyć?
Dziękuję.
Używam tego:Jak powiązać właściwość SelectionStart w polu tekstowym?
<TextBox x:Name="Test"/>
<TextBlock Text="{Binding SelectionStart, ElementName=Test}"/>
ale zawsze pokazuje 0.
Jak mogę leczyć?
Dziękuję.
O ile mi wiadomo, ta funkcja nie została uwzględniona w Silverlight 2.0.
Przeczytać artykuł this dla rozwiązania typu work-around.
Nie można powiązać obiektu SelectionStart, ponieważ nie jest to właściwość DependencyProperty.
:) Dziękuję bardzo. – Ivan
Czy istnieje sposób, aby dowiedzieć się, które właściwości w danym formancie to DependencyProperties, a które nie? –
Najszybszym sposobem jest użycie IntelliSense z Visual Studio. Załóżmy na przykład, że chcesz zobaczyć wszystkie właściwości zależności w oknie TextBox. Po prostu wpisz TextBox. a intellisense pokaże Ci wszystkie właściwości zależności. –
wpadłem na ten problem (SelectionStart i SelectionLength nie są właściwościami zależnościami) i postanowił uczynić TextBox z Bindable rozpoczęcia oraz zakończenia:
public class SelectionBindingTextBox : TextBox
{
public static readonly DependencyProperty BindableSelectionStartProperty =
DependencyProperty.Register(
"BindableSelectionStart",
typeof(int),
typeof(SelectionBindingTextBox),
new PropertyMetadata(OnBindableSelectionStartChanged));
public static readonly DependencyProperty BindableSelectionLengthProperty =
DependencyProperty.Register(
"BindableSelectionLength",
typeof(int),
typeof(SelectionBindingTextBox),
new PropertyMetadata(OnBindableSelectionLengthChanged));
private bool changeFromUI;
public SelectionBindingTextBox() : base()
{
this.SelectionChanged += this.OnSelectionChanged;
}
public int BindableSelectionStart
{
get
{
return (int)this.GetValue(BindableSelectionStartProperty);
}
set
{
this.SetValue(BindableSelectionStartProperty, value);
}
}
public int BindableSelectionLength
{
get
{
return (int)this.GetValue(BindableSelectionLengthProperty);
}
set
{
this.SetValue(BindableSelectionLengthProperty, value);
}
}
private static void OnBindableSelectionStartChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
var textBox = dependencyObject as SelectionBindingTextBox;
if (!textBox.changeFromUI)
{
int newValue = (int)args.NewValue;
textBox.SelectionStart = newValue;
}
else
{
textBox.changeFromUI = false;
}
}
private static void OnBindableSelectionLengthChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
var textBox = dependencyObject as SelectionBindingTextBox;
if (!textBox.changeFromUI)
{
int newValue = (int)args.NewValue;
textBox.SelectionLength = newValue;
}
else
{
textBox.changeFromUI = false;
}
}
private void OnSelectionChanged(object sender, RoutedEventArgs e)
{
if (this.BindableSelectionStart != this.SelectionStart)
{
this.changeFromUI = true;
this.BindableSelectionStart = this.SelectionStart;
}
if (this.BindableSelectionLength != this.SelectionLength)
{
this.changeFromUI = true;
this.BindableSelectionLength = this.SelectionLength;
}
}
}
Dobry człowiek, bardzo przydatny! –
może to być rozwiązanie alternatywne:
View :
<TextBox Text="{Binding Text}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<mvvml:EventToCommand Command="{Binding TextBoxSelectionChangedCommand}"
PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
ViewModel:
#region TextBoxSelectionChangedCommand
RelayCommand<RoutedEventArgs> _TextBoxSelectionChangedCommand = null;
public ICommand TextBoxSelectionChangedCommand {
get {
if (_TextBoxSelectionChangedCommand == null) {
_TextBoxSelectionChangedCommand = new RelayCommand<RoutedEventArgs>((r) => TextBoxSelectionChanged(r), (r) => true);
}
return _TextBoxSelectionChangedCommand;
}
}
protected virtual void TextBoxSelectionChanged(RoutedEventArgs _args) {
YourCursorPositionVariable = (_args.OriginalSource as System.Windows.Controls.TextBox).SelectionStart;
}
#endregion
Zgadzam się, że musisz rzucić typ komponentu TextBox w ViewModel i jest to rodzaj sprzężenia, ale utworzyć niestandardowy składnik zobowiązuje się również do wiązania określonej właściwości.
Ta funkcja została dodana w Silverlight 3. i działa bardzo dobrze w tym przykładzie: Ale nie działa w moim. Nie podoba mi się ten artykuł, ten styl faktycznie zabija całe piękno wiązania. –
Ivan