有一個問題,如何將后面的代碼轉換為mvvm風格,這里有一個樣本
。void CameraView_MediaCaptured(object sender, MediaCapturedEventArgs e)。
{
switch (cameraView.CaptureMode)
{
default:
case CameraCaptureMode.Default:
case CameraCaptureMode.Photo:
previewVideo.IsVisible = false;
previewPicture.IsVisible = true;
previewPicture.Rotation = e.Rotation;
previewPicture.Source = e.Image;
doCameraThings.Text = "Snap Picture"。
break;
case CameraCaptureMode.Video:
previewPicture.IsVisible = false;
previewVideo.IsVisible = true;
previewVideo.Source = e.Video。
doCameraThings.Text = "Start Recording"。
break;
}
uj5u.com熱心網友回復:
Jason和Karas的答案的組合。
用 "B "來系結。
在xaml和viewmodel之間用相應的屬性進行系結。
//xaml IsVisible = "{Binding IsVisible}"/span>在viewmodel里面實作
INotifyPropertyChanged。public class ViewModel: INotifyPropertyChanged ViewModel. { public event PropertyChangedEventHandler PropertyChanged。 public void NotifyPropertyChanged([CallerMemberName] String propertyName = ") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pertyName))。 } private bool isVisible; public bool IsVisible { get IsVisible { { return isVisible; } set { isVisible; } { isVisible = value; NotifyPropertyChanged()。 } }用EventToCommandBehavior替換該事件,并更改屬性值。
//xaml <xct:EventToCommandBehavior。 EventName="MediaCaptured"。 Command="{Binding MyCommand}" />//viewmodel public ICommand MyCommand { get; set; } public ViewModel() { MyCommand = new Command((obj)=> { var cameraView = obj as CameraView; switch (cameraView.CaptureMode) { default: case CameraCaptureMode.Default: case CameraCaptureMode.Photo: IsVisible = false; break; case CameraCaptureMode.Video。 IsVisible = false; break; } }); }
uj5u.com熱心網友回復:
首先,你創建一個BaseViewModel,現在你可以在其他每個ViewModel上繼承它。然后你的ViewModel通過BindingContext = new YourPageVM()與你的頁面通過YourPage.cs系結。你現在可以在你的ViewModel中創建屬性并在XAML中系結它們。 這里是BaseViewModel:
。 public abstract class BaseViewModel : INotifyPropertyChanged
{
公共事件 PropertyChangedEventHandler PropertyChanged。
protected void OnPropertyChanged([CallerMemberName] string
propertyName =
"")
{
var changed = PropertyChanged;
如果(change == null)
回傳。
changed.Invoke(this, new
PropertyChangedEventArgs(propertyName))。
}
protected bool SetProperty<T> (ref T backingStore, T value,
[CallerMemberName] string propertyName = ""。
Action onChanged = null)
{
如果(EqualityComparer<T>.Default.Equals(backingStore, value)
回傳false。
backingStore = value;
onChanged?.Invoke()。
OnPropertyChanged(propertyName);
回傳true。
}
}
//在你的虛擬機中。
public class YourPageVM : BaseViewModel
{
bool isVisPreVideo;
public bool IsVisPreVideo{
get=> isVisPreVideo;
set=> SetProperty(ref isVisPreVideo,value);}。
//在建構式中或在你的方法中設定該值
public YourPageVM()
{
IsVisPreVideo = false;
}
//........
}
//在Xaml:
xmlns:viewmodel="clr-namespace:YourProject.ViewModel"
x:DataType="viewmodel:YourPageVM"
IsVisible = "{Binding IsVisPreVideo}"
這一點你也可以用其他值旋轉、源和文本來做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/317287.html
標籤:
