如何为metro控件执行绑定

时间:2012-09-04 15:44:40

标签: windows-8 windows-runtime winrt-xaml windows-store

当用户按下用于保存的组合键(Ctrl-S)时,我想将每个活动TextBox的内容写回ViewModel的bound属性。

我的问题是,我无法触发绑定的执行,因此绑定的Text-Property反映了TextBox的内容。

- 似乎没有GetBinding方法。因此,我无法获得Binding并手动执行它 - 没有Validate方法,例如在WinForms中执行绑定
- 将焦点放在KeyDown中的另一个控件似乎不起作用,绑定不会执行

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

在他的WiredPrarie博客文章中查看Aaron对此的讨论:http://www.wiredprairie.us/blog/index.php/archives/1701

答案 1 :(得分:1)

我想我现在更了解你的问题。解决这个问题的一种方法是使用带有here的新属性的子类文本框:

public class BindableTextBox : TextBox
{
    public string BindableText
    {
        get { return (string)GetValue(BindableTextProperty); }
        set { SetValue(BindableTextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for BindableText.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BindableTextProperty =
        DependencyProperty.Register("BindableText", typeof(string), typeof(BindableTextBox), new PropertyMetadata("", OnBindableTextChanged));

    private static void OnBindableTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs eventArgs)
    {
        ((BindableTextBox)sender).OnBindableTextChanged((string)eventArgs.OldValue, (string)eventArgs.NewValue);
    }

    public BindableTextBox()
    {
        TextChanged += BindableTextBox_TextChanged;
    }

    private void OnBindableTextChanged(string oldValue, string newValue)
    {
        Text = newValue ? ? string.Empty; // null is not allowed as value!
    }

    private void BindableTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        BindableText = Text;
    }    
}

然后绑定到BindableText属性。

答案 2 :(得分:0)

命令实例解决方案
这里我找到的解决方案相对轻量级,但也有点“hackish”:

btn.Focus(Windows.UI.Xaml.FocusState.Programmatic);
Dispatcher.ProcessEvent(CoreProcessEventsOption.ProcessAllIfPresent);         
btn.Command.Execute(null);

首先,我将焦点放在另一个控件上(在我的例子中是带有bound命令的按钮)。然后我给系统时间执行绑定,最后我提出绑定到按钮的命令。

没有绑定命令的解决方案
将Focus赋予另一个控件并调用Dispatcher.ProcessEvent(...)。

anotherControl.Focus(Windows.UI.Xaml.FocusState.Programmatic);
Dispatcher.ProcessEvent(CoreProcessEventsOption.ProcessAllIfPresent);
// Do your action here, the bound Text-property (or every other bound property) is now ready, binding has been executed

请参阅BStateham的解决方案 这是解决问题的另一种方法