在不使用视图模型的情况下,从用户控件通知属性更改
本文关键字:控件 用户 通知 属性 情况下 视图 模型 | 更新日期: 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); }
}
}