ฉันทำงานอยู่บน WPF โครงการกับ MVVM และฉันเจอปัญหาของไม่ยอมรับสายสุดท้ายข้อความเปลี่ยนไปเมื่อข้าอคลิกที่ปุ่มบันทึก.
ของส่วนประกอบติดตั้งแบบนี้:
- เป็นแถบเครื่องมือมุมมองกับบนแถบเครื่องมือ VM ซึ่งมีบันทึกปุ่ม. ปุ่ม คลิกเหตุการณ์มันจะเป็น Icommand.
- เป็นรูปแบบมุมมองกับกลุ่มของข้อความช่องข้อมูลจะถูเป็น sepreate VM.
- แถบเครื่องมือมุมมองและรูปแบบมุมมองอยู่ใน seperate งแฟ้ม
- ทั้งหมดของฉั VMs inherits จาก BindableBase(ส่วนหนึ่งของ Prism.MvvM ล่อง)
บนคลิกที่ปุ่มฉันจะใช้ค่าจากรูปแบบ VM และช่วยพวกเขา...เรียบง่ายและ stragight ไปข้างหน้า ทุกอย่างยังเป็นไปด้วยดียกเว้นแต่ว่าเมื่อทำการแก้ไขเมื่อทำการคลิกที่ปุ่มบันทึกไม่ได้ระตุ้นสูญเสียโฟกัสองเหตุการณ์. ดังนั้นทรัพย์สินตั้งค่าเหตุการณ์ไม่ใช่การกระตุ้น ฉันจะต้องคลิกที่ห่างออกจากช่องข้อมูลหลังจากทำการแก้ไขนั้นคลิกบนปุ่ม นี่คือของฉันรหัส:
public class ViewModel: BindableBase
{
private string _someText;
public string SomeText
{
get { return _someText; }
set { SetProperty(ref _someText, value); }
}
}
ในมุมมอ XAML:
<TextBox Text="{Binding SomeText}"/>
ในแถบเครื่องมื XAML:
<Button Command="{Binding SaveCommand}" ToolTip="Save">
</Button>
ViewModel สำหรับแถบเครื่องมือ:
public class ToolbarViewModel : BindableBase
{
private ICommand _saveCommand;
public ICommand SaveCommand
{
get
{
return _saveCommand ?? (_saveCommand = new BaseCommandHandler(() => {
//Save code
}, () => true));
}
}
}
รหัสสำหรับ BaseCommandHandler:
public class BaseCommandHandler : ICommand
{
private Action _action;
private Func<bool> _canExecute;
/// <summary>
/// Creates instance of the command handler
/// </summary>
/// <param name="action">Action to be executed by the command</param>
/// <param name="canExecute">A bolean property to containing current permissions to execute the command</param>
public BaseCommandHandler(Action action, Func<bool> canExecute)
{
_action = action;
_canExecute = canExecute;
}
/// <summary>
/// Wires CanExecuteChanged event
/// </summary>
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
/// <summary>
/// Forcess checking if execute is allowed
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
return _canExecute.Invoke();
}
public void Execute(object parameter)
{
_action();
}
}
มีใครรู้ทำความสะอาดวิธีที่จะทำให้แน่ใจว่าสนใจคือสูญเสียหรือทางที่จะระตุ้นตั้งค่าเหตุการณ์ของคุณสมบัติของ bindable