在不使用视图模型的情况下,从用户控件通知属性更改

本文关键字:控件 用户 通知 属性 情况下 视图 模型 | 更新日期: 2023-09-27 18:06:08

我有一个UserControl来包装ActiveX控件。此控件是一个同时具有文本和声音的编辑器。(该文本已被语音识别,因此当您播放声音时,正确的单词会突出显示)。

下面是来自UserControl的代码:
public partial class EditorWrapper : UserControl
{
    private CdsEditorOverrides editorCtrl;
    public TextWithSound TextSound
    {
        set
        {
            try
            {
                if(value.Text != null && value.Stream != null)
                {
                    editorCtrl.LoadDocumentSetAsXmlString(value.Text);
                    editorCtrl.GetAudioPlayer().LoadAudioFromStream(new StreamWrapper(value.Stream));
                    editorCtrl.GetAudioPlayer().AudioStreamingComplete();
                    Debug.WriteLine("TextSound updated");
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Error loading Text: " + ex.ToString());
                //don't throw in get/set
            }
        }
    }
    public int SoundLength
    {
        get
        {
            return editorCtrl.GetAudioPlayer().GetPlaybackLength();
        }
        set { /* do nothing */ }
    }

下面是我尝试使用它的XAML代码:

<editorWrapper:EditorWrapper 
    Name="editorObj" 
    TextSound="{Binding Dictation.TextWithSound}"
    SoundLength="{Binding Dictation.SoundLengthInMilliseconds, Mode=OneWayToSource}"/>

我想在设置TextSound属性时通知SoundLength也发生了变化。我怎么做呢?我是否必须实现这个用户控件的ViewModel或有另一种方式?

在不使用视图模型的情况下,从用户控件通知属性更改

如果我是你,我会创建一个viewModel并将这些值绑定到viewModel中的一些属性。在将这些值绑定到viewmodel中的属性之前,你必须将TextSound和SoundLength属性转换为Dependency属性。(绑定在这方面起作用)绑定之后,您可以编写一些逻辑,以便为这些依赖项属性设置属性。当你为SoundLength设置依赖属性时,设置另一个并通过

发送通知
OnpropertyChanged("SomeProp1"); // prop to SoundLenth
OnpropertyChanged("SomeProp2"); // prop to TextSound

欢呼

您可以将SoundLength属性定义为DependencyProperty

你的UserControl应该是这样的:

public partial class EditorWrapper : UserControl
{
    // Your defined DependencyProperty
    public static readonly DependencyProperty SoundLengthProperty=DependencyProperty.Register("SoundLength",typeof(int),typeof(EditorWrapper),new PropertyMetadata(OnSoundLengthChanged));
    public TextWithSound TextSound
    {
        set
        {
            try
            {
                if(value.Text != null && value.Stream != null)
                {
                    CdsEditorOverrides editorCtrl.LoadDocumentSetAsXmlString(value.Text);
                    editorCtrl.GetAudioPlayer().LoadAudioFromStream(new StreamWrapper(value.Stream));
                    editorCtrl.GetAudioPlayer().AudioStreamingComplete();
                    // set the sound length (will automatically notify the binding)
                    SoundLength=editorCtrl.GetAudioPlayer().GetPlaybackLength();
                    Debug.WriteLine("TextSound updated");
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Error loading Text: " + ex.ToString());
                //don't throw in get/set
            }
        }
    }
    // The actual Property: gets/sets the value to the DependencyProperty
    public int SoundLength
    {
        get { return (int)GetValue(SoundLengthProperty); }
        private set { SetValue(SoundLengthProperty,value); }
    }
}