2012-02-23 27 views
12

Mới đối với WPF. Tôi có bàn phím số trên màn hình để nhập mã PIN. Những gì tôi muốn làm là vô hiệu hóa các nút khi nhập bốn chữ số PIN. Tôi chắc chắn có thể làm điều này với mã khá dễ dàng, nhưng có vẻ như với tôi là một thứ nên được thực hiện với sự ràng buộc.Binding To An Expression

Cái gì như:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox ???}/> 

Dường như không có một cách để làm điều đó Vì vậy, tôi coi là sự thay thế, đó là một tài sản đồng bằng trên (mà phải trung thực dường như khá nguyên thủy với tôi.) lớp Window bên dưới. Nhưng tôi không chắc chắn làm thế nào để liên kết với nó (tôi có cần phải xác định chính lớp đó làm bối cảnh dữ liệu riêng của nó không, hay tôi cần trích xuất chuỗi mã PIN thành dạng xem?)

Và sau đó, làm thế nào Tôi nhận được tài sản đơn giản để cập nhật GUI.

Tôi cho rằng tôi có thể xác định lớp mô hình chế độ xem và có thuộc tính phụ thuộc được gọi là "ButtonsEnabled" nhưng có vẻ như là loại nặng cho một vấn đề đơn giản như vậy.

Hãy cho tôi biết nếu tôi thiếu điều gì đó.

+0

bạn có thể thử [** ràng buộc thành phần của bạn (nút) đến một function **] (http://social.msdn.microsoft.com/Forums/en/wpf/thread/b92178bc-bc1a-4ec0-ad94-b86bbf2ea56a) –

Trả lời

11

Bạn có thể viết một chuyển đổi mà trở boolean tùy thuộc vào chữ số trong TextBox

Các XAML fo nút r sẽ

<Button Content="Test" IsEnabled="{Binding ElementName=PinBox,Path=Text,Converter={StaticResource DigitsToBoolConverter}}" Grid.Row="1" Height="20" Width="100"></Button> 

nơi PinBox là tên hộp văn bản được sử dụng để nhập mã pin.

Chức năng Converter là

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    return value.ToString().Length >= 4; 
} 
3

Không, bất cứ điều gì không thiếu của bạn, WPF ra khỏi các ràng buộc hộp không hỗ trợ các biểu thức.

Hiện đã có một số người thực hiện các lớp học của mình mà thêm loại chức năng: http://www.11011.net/wpf-binding-expressions

Nhưng thực sự, đây là những gì mô hình ViewModel là cho. Sử dụng nó, nó không nặng.

+0

liên kết đó không hoạt động nữa. – brainydexter

+0

Với điều này là hơn 5 tuổi tôi không ngạc nhiên :) – Tyson

+0

@ brainydexter bạn có thể sử dụng máy rút tiền? https://web.archive.org/web/20160313063004/http://www.11011.net/wpf-binding-expressions Nhưng với hơn 5 năm tuổi, tôi sẽ đề nghị một google 'wpf ràng buộc bao gồm cả biểu hiện' hoặc một cái gì đó như thế. – Tyson

0

Tạo một converter sẽ trả về true hoặc false dựa trên PinBox.Text.Length.

XAML của bạn sau đó sẽ trở thành:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox, Converter={StaticResource yourConverter}}/> 
8

Một cách khác để sử dụng commands:

XAML:

<Button Content="2" Style="Whatever" Command={Binding MyCommand} CommandParamater="2"/> 

ViewModel:

public ICommand MyCommand { get; private set; } 
public string PinNumber { get; private set; } 
public void Init() 
{ 
    MyCommand = new RelayCommand(
    param => AddPinNumberDigit(param), 
    param => CanAddPin); 
} 
private void AddPinNumberDigit(string digit) 
{ 
    PinNumber += digit; 
} 
public bool CanAddPin { 
    get 
    { 
    return PinNumber.Length < 3; 
    } 
} 
+0

Tôi thích câu trả lời này và học được rất nhiều từ nó, nhưng cuối cùng tôi thực sự sử dụng công cụ chuyển đổi. Tôi muốn tôi có thể chấp nhận cả hai, nhưng tôi đã upvote bạn. –